System.Net.WebSockets.WebSocket 需要.NET 4.5,IIS8以上,Windows Server2008R2自帶的IIS不支持,Windows8及Server2012以上自帶的IIS可以 1、實現IHttpHandler用於處理webSocket請求 2、在web.C ...
System.Net.WebSockets.WebSocket
需要.NET 4.5,IIS8以上,Windows Server2008R2自帶的IIS不支持,Windows8及Server2012以上自帶的IIS可以
1、實現IHttpHandler用於處理webSocket請求
using System; using System.Net.WebSockets; using System.Threading.Tasks; using System.Web; using System.Web.WebSockets; namespace WebSocketTest { public class MyWebSocketHandler : IHttpHandler { /// <summary> /// 設置實例不可以重覆使用 /// </summary> public bool IsReusable { get { return false; } } /// <summary> /// 判斷是否是WebSocket請求 /// 是交由handlerWebSocketAsync方法處理 /// </summary> /// <param name="context"></param> public void ProcessRequest(HttpContext context) { if (context.IsWebSocketRequest) { context.AcceptWebSocketRequest(handlerWebSocketAsync); } } private async Task handlerWebSocketAsync(AspNetWebSocketContext context) { WebSocket webSocket = context.WebSocket; await webSocket.SendMsgAsync("連接成功"); while (true) { if (webSocket.State == WebSocketState.Open) { string msg = await webSocket.ReceiveMsgAsync(); webSocket.SendMsgAsync(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + @",Receive:" + msg); } } } } }
webSocket.ReceiveMsgAsync 和 webSocket.SendMsgAsync 是我自己封裝的兩個擴展方法,用於字元串和byte[]轉換
using System; using System.Net.WebSockets; using System.Text; using System.Threading; using System.Threading.Tasks; namespace WebSocketTest { public static class WebSocketHelper { /// <summary> /// 發送消息 /// </summary> /// <param name="webSocket"></param> /// <param name="msg"></param> /// <returns></returns> public static async Task SendMsgAsync(this WebSocket webSocket, string msg) { byte[] bytesMsg = Encoding.UTF8.GetBytes(msg); ArraySegment<byte> segment = new ArraySegment<byte>(bytesMsg); await webSocket.SendAsync(segment, WebSocketMessageType.Text, true, CancellationToken.None); } /// <summary> /// 接收消息 /// </summary> /// <param name="webSocket"></param> /// <returns></returns> public static async Task<string> ReceiveMsgAsync(this WebSocket webSocket) { ArraySegment<byte> receiveSegment = new ArraySegment<byte>(new byte[1024]); WebSocketReceiveResult receiveResult = await webSocket.ReceiveAsync(receiveSegment, CancellationToken.None); string clientMsg = Encoding.UTF8.GetString(receiveSegment.Array, 0, receiveResult.Count); return clientMsg; } } }
2、在web.Config中加入自定義的handler,集成模式需要在<system.webServer>節點配置,經典模式在<system.web>節點配置
<system.web> <compilation debug="true" targetFramework="4.6.1"/> <httpRuntime targetFramework="4.5"/> <!--<httpHandlers> <add verb="*" path="*" type="WebSocketTest.MyWebSocketHandler, WebSocketTest" /> </httpHandlers>--> </system.web> <system.webServer> <handlers> <add name="webSocketHandler" verb="*" path="*" type="WebSocketTest.MyWebSocketHandler, WebSocketTest"/> </handlers> </system.webServer>
3、運行VS,進行測試
運行結果