一, 背景
其实就是很简单的, 公司会桌面开发的人员紧缺啊, 项目又赶, 而我们公司的前端人员人多还厉害 (ps: 吐槽下, 后端的人真的少啊, 会桌面开发的更少啊), 所以萌生出了使用 html+js 来构建本地应用程序, 但是我们的客户基本都是制造行业, 需要对很多硬件进行交互 (IO 卡, PLC, 串口等等各种), 那就势必还是需要传统的应用程序 (毕竟方案多),emmm, 那这两者之间需要怎么样结合呢? so 就有了本文, 让 winform 变成一个 httpserver, 这样就可以接入各种硬件以及处理耗时动作, 将界面跟业务处理分开, 当时这个还是前端人员提出能不能用前端技术构建界面, 后面我们一合计, 应该是可以试试 (ps: 大佬们如果有问题请轻拍啊)
二, 技术点说明
websocket-sharp
https://github.com/sta/websocket-sharp 是开源的 websocket 的 C# 封装, 可以帮助我们快速构建 websocket 的相关应用, 但是同时它也提供了 httpserver 的功能, 这次选型这个的缘故也是因为有 websocket 的存在, 后续扩展做实时的数据交互应该是非常方便的
其他:
autofac(IOC 使用),json.net(json 序列化使用)
三, 关注点
如图所示, 对于一个自动更新程序, 关注点应该都是以上几个点
支持 Get 以及 Post 请求, 这个应该是基本的 (对于其他请求没有进行封装)
依赖注入, 还是很好用的, 最直观的就是不用写 new 对象了
异常 filter, 可以实现全局异常捕获以及处理 (服务端开发应该用的比较多)
文件获取, 最直观的就是要显示图片咋办
自定义 filter, 就是平常我们针对于每个 action 的拦截器 (目前还未实现)
大致应该就以上几点, 如果实现以上几点, 应该可以算是一个像模像样的简陋版 httpserver(只支持 api 访问的那种)
四, 设计流程图
一些说明:
1, 为了减少依赖, 我将 websocket-sharp 的源码全部放入到 MHttpServer 项目中, 感谢 websocket-sharp 的作者, 可以让我方便的实现 httpserver 的功能
2, 整体流程就如上所示, 应该还是比较顺畅, 我目前是把自己做服务器端开发时候的一些惯性思路带到这个项目中, 有可能会不符合其他人的开发习惯
3, 其他具体看 github 的代码, 如果有人想做研究的话
4, 程序考虑支持 XP, 所以将. net framework 的版本定在 4.0, 所以 autofac 的版本是比较低的, 这个如果需要最新版本可以自己去升级
5, 整体的开发参照目前 WebApi 的方式进行, 路由规则定为 controller/action(例如: User/Add), 所以是没有参照 restful 的标准 (实际原因是理解不了 Restful 怎么应付复杂的 http 请求场景, 例如参数个数类型一样的情况下??)
五, 如何使用
新建 winform 项目后, 在需要开启的地方里加入以下代码:
- MHttpServer.Listen listen = new MHttpServer.Listen(8088);
- ContainerBuilder builder = new ContainerBuilder();
- builder.RegisterType<TestService>().PropertiesAutowired();
- listen.InitController(builder);
- listen.start();
以上代码是实例化一个 httpserver 对象, 并且将 service 注入到 buid 中, 将 build 传入到 InitController, 通过这种方式实现全局的依赖注入
效果如下:
正常执行, 并且触发更新 winform 的界面, TestDo 方法是一个事件, 事件中将收到的数据显示在 form 的 richtextbox 中
故意触发异常执行:
触发异常执行的时候, 如下图所示, 进入了 ExceptionFilter 中, 并且将处理过的异常返回到前端
六, 总结
这次的实践只是一个新的尝试, 如果效果比较好的话, 后续对于交互要求比较高的程序, 应该都会采用这种方案进行, 通过 NanUI 或者 electron 构建界面, 本地开启 httpserver 进行硬件的交互以及业务上的数据查询, 充分发挥团队中每个人的作用
这个项目中的大部分东西都是第三方开源产品, 我只是做了一个封装, 所以最后感谢开源这些产品的作者们
由于个人原因, 在测试上可能会有所不够, 如果有什么 bug 的话, 还请告知, 感谢 (ps: 文字表达弱鸡, 多多包涵)
项目地址: https://github.com/Hello-Mango/MHttpServer
来源: https://www.cnblogs.com/OMango/p/9637970.html