一、背景

  其实就是很简单的,公司会桌面开发的人员紧缺啊,项目又赶,而我们公司的前端人员人多还厉害(ps:吐槽下,后端的人真的少啊,会桌面开发的更少啊),所以萌生出了使用html+js来构建本地应用程序,但是我们的客户基本都是制造行业,需要对很多硬件进行交互(IO卡、PLC、串口等等各种),那就势必还是需要传统的应用程序(毕竟方案多),emmm,那这两者之间需要怎么样结合呢?so就有了本文,让winform变成一个httpserver,这样就可以接入各种硬件以及处理耗时动作,将界面跟业务处理分开,当时这个还是前端人员提出能不能用前端技术构建界面,后面我们一合计,应该是可以试试(ps:大佬们如果有问题请轻拍啊

二、技术点说明

  websocket-sharp

  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();
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

作者: Mango

出处: http://www.cnblogs.com/OMango/

关于自己:专注.Net桌面开发以及Web后台开发,开始接触微服务、docker等互联网相关(最近被互联网架构搞的死去活来- -)

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,如有问题, 可站内信告知.

  

  

C#基于websocket-sharp实现简易httpserver(封装)的更多相关文章

  1. 高效简易开发基于websocket 的通讯应用

    websocket的主要是为了解决在web上应用长连接进行灵活的通讯应用而产生,但websocket本身只是一个基础协议,对于消息上还不算灵活,毕竟websocket只提供文本和二进制流这种基础数据格 ...

  2. 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(二)

    我们上一篇<基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)>主要讲解了如何搭建一个实时数据通讯服务器,客户端与服务端是如何通讯的,相信通过上一篇的讲解,再配 ...

  3. 第一节:.Net版基于WebSocket的聊天室样例

    一. 说在前面的话 该篇文章为实时通讯系列的第一节,基于WebSocket编写了一个简易版聊天样例,主要作用是为引出后面SignalR系列的用法及其强大方便之处,通过这个样例与后续的SignalR对比 ...

  4. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  5. Go实现基于WebSocket的弹幕服务

    拉模式和推模式 拉模式 1.数据更新频率低,则大多数请求是无效的 2.在线用户量多,则服务端的查询负载高 3.定时轮询拉取,实时性低 推模式 1.仅在数据更新时才需要推送 2.需要维护大量的在线长连接 ...

  6. 基于Netty的RPC简易实现

    代码地址如下:http://www.demodashi.com/demo/13448.html 可以给你提供思路 也可以让你学到Netty相关的知识 当然,这只是一种实现方式 需求 看下图,其实这个项 ...

  7. Django中使用websocket并实现简易聊天室

    django使用websocket并实现简易聊天室 django默认只支持http协议 如果你想让django即支持http协议又支持websocket协议,则需要做以下配置 前期配置 前提需要安装c ...

  8. 基于websocket实现的一个简单的聊天室

    本文是基于websocket写的一个简单的聊天室的例子,可以实现简单的群聊和私聊.是基于websocket的注解方式编写的.(有一个小的缺陷,如果用户名是中文,会乱码,不知如何处理,如有人知道,请告知 ...

  9. Socket.IO – 基于 WebSocket 构建跨浏览器的实时应用

     Socket.IO 是一个功能非常强大的框架,能够帮助你构建基于 WebSocket 的跨浏览器的实时应用.支持主流浏览器,多种平台,多种传输模式,还可以集合 Exppress 框架构建各种功能复杂 ...

随机推荐

  1. Vue-详解设置路由导航的两种方法

    https://www.cnblogs.com/superlizhao/p/8527317.html

  2. pycharm中查找一个对象在哪里被引用

    pycharm中查找一个对象在哪里被引用 2018年10月28日 19:22:20 vivian_wanjin 阅读数:1600   PyCharm的Find Usages功能可以查找某个对象(变量. ...

  3. [BJOI2019]排兵布阵——分组背包

    题目链接: [BJOI2019]排兵布阵 对于每座堡垒,将$s$个对手排序,显然如果安排的兵力能打败第$i$个对手就一定能打败前$i-1$个. 那么对于第$i$座城堡,可以看做有$s+1$个物品(可以 ...

  4. [洛谷P1392] 取数

    无法用复杂状态进行转移时改变计算方式:巧妙的整体考虑:压缩空间优化时间 传送门:$>here<$ 题意 给出一个n*m矩阵,从每一行选一个数加起来,可以得到一个和.易知总共会有$n^n$个 ...

  5. [洛谷P1006] 传纸条

    双线程DP的常识:DP的阶段问题:多阶段决策问题 传送门:$>here<$ 题意 n*m的矩阵里,从左上角走到右下角(只能往右或往下),再从右下角走回左上角(只能往左或往上).其中不能重复 ...

  6. vmware创建虚拟机不识别网卡

    今天在给虚拟机添加网卡的时候,出现了虚拟机不识别新加的网卡,很纳闷,连的一样的端口组,为什么新加的网卡识别不了呢 然后查看pci设备,发现网卡的驱动为 AMD 79C970 PCnet32- LANC ...

  7. spring启动容器加载成功后执行调用方法

    需求: 由于在微服务架构中各服务之间都是通过接口调用来进行交互的,像很多的基础服务,类似字典信息其实并不需每次需要的时候再去请求接口.所以我的想法是每次启动项目的时候,容器初始化完成,就去调用一下基础 ...

  8. 堆以及一些用法 QWQ这是写得最认真的板子题

    最近一直在学图论,然后吧,由于学的东西实在是太多太杂了,加上蒟蒻本蒻又经常颓,所以落了好多好多板子题的整理没写啊嘤嘤嘤,不过把这些东西学的差不多了,再一块写个整理,其实感觉还不错?????也算是很神奇 ...

  9. SQL server 行转列 列转行

    1.简单案例 create database Hang go use Hang create table Students ( Name varchar(50), Kemu varchar(50), ...

  10. SQLServer安装步骤(2012版为例)

    提示:SQLServer安装较为耗时,请确保时间充足. 图文如果无法正常显示,请移步 SQLServer安装步骤 第一步:下载 下载地址:https://www.microsoft.com/zh-cn ...