一、背景 其實就是很簡單的,公司會桌面開發的人員緊缺啊,項目又趕,而我們公司的前端人員人多還厲害(ps:吐槽下,後端的人真的少啊,會桌面開發的更少啊),所以萌生出了使用html+js來構建本地應用程式,但是我們的客戶基本都是製造行業,需要對很多硬體進行交互(IO卡、PLC、串口等等各種),那就勢必還 ...
一、背景
其實就是很簡單的,公司會桌面開發的人員緊缺啊,項目又趕,而我們公司的前端人員人多還厲害(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(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
作者: Mango
出處: http://www.cnblogs.com/OMango/
關於自己:專註.Net桌面開發以及Web後臺開發,開始接觸微服務、docker等互聯網相關(最近被互聯網架構搞的死去活來- -)
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,如有問題, 可站內信告知.