.Net Webapi SignalR與微信小程序的交互
一、SignalR與Webapi
1、SignalR的安裝:

Signalr與跨域僅需要安裝兩個開源庫

Microsoft.Owin.Cors是配置跨域需要使用到的庫。
2、SignalR的配置
需要新建一個Startup.cs文件來編寫配置代碼,我是建在App_Start文件夾里,與其他配置文件統一放置一起。


Configuration的配置不僅限於如此配置,也可以自定義,如:

3、Hub與Webapi的整合

創建Webapi父類,繼承ApiController。則可以在需要使用Hub實時推送消息的api中繼承這個父類,便可以直接使用Clients或Groups推送消息。簡單來講,就是可以通過Webapi進行signalr的消息推送。

4、Hub的創建與事件
直接在新建項中便可以創建對應的類文件。

在新建的文件中需要重寫Hub的幾個事件:



這3個事件都可以在其中進行業務處理。
在這個集線器中還可以定義推送消息的方法,后面在Web中可以直接調用。
二、SignalR與Web
當安裝SignalR的時候,signalr會自帶創建了Script文件夾(如還沒有改文件夾的話),里面會新增一些js文件:

在Web的調用中,就會使用到jquery.signalR-2.0.0.js。這里簡單介紹一下使用即可,不是重點。
服務端:

客戶端:

三、SignalR與小程序(全國第一例)
目前在百度及谷歌中幾乎找不到Webapi與微信小程序的交互的文檔,只能自己摸索。
首先從Web請求入手:

跟進web端的請求報文看:
第一個請求:主要是請求signalr獲取授權密鑰
請求頭:

響應:

響應中的數據在第二個請求連接中有用到connectionToken進行鑒權連接,如果沒有這個參數,第二個請求是沒有辦法連接成功的。那在微信小程序中的請求如下:

第二個請求:請求連接signalr
請求Url:

請求Url中的參數:

請求中除了一定要的參數外,tid其實可以算是自定義的參數,可以在服務端Hub里面獲取到自帶的參數的值。

這樣就可以獲取到自定義的參數。那么在微信小程序端的代碼如下:(這里要重點標明,參數和ConnectionToken都需要使用encodeURIComponent來進行參數的encode,否則會連接不成功了)

除了Open事件,還有onClose、onError、onMessage等事件,詳細請查看微信官方文檔。這里重點是onMessage,它是接收推送的消息的事件,這里可以處理展示推送的內容。
第三個請求:Web端還會發送第三個請求,也就是start。但在微信小程序端,Open就相當於start了。但還是貼一下Web端的請求:
消息頭:

參數:傳遞的參數其實跟connect(第二個請求)的參數是一樣的。

到這里,整個交互過程就結束了。
補充:
Windows server 2008r2的iis是沒有websocket這一應用程序的,所以在2008r2上部署項目,web端訪問是沒有問題的,但在微信小程序中則不可以。因為在web端中的連接中,如果服務端支持websocket,請求會自動升級請求,如下圖所示:

當服務器不支持websocket的時候,則會自動改問輪詢的方式。這就是為什么微信小程序在2008r2中沒法連接的原因。Iis8后支持。
不支持時,請求如圖所示:

Iis8中安裝websocket:

