1. 程式人生 > >C#實現簡易httpserver

C#實現簡易httpserver

一、背景

  其實就是很簡單的,公司會桌面開發的人員緊缺啊,專案又趕,而我們公司的前端人員人多還厲害(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請求場景,例如引數個數型別一樣的情況下??)

  6、

五、如何使用

新建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:文字表達弱雞,多多包涵)

作者: Mango

關於自己:專注.Net桌面開發以及Web後臺開發,開始接觸微服務、docker等網際網路相關(最近被網際網路架構搞的死去活來- -)

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結,如有問題, 可站內信告知.