Asp.Net Core中WebSocket綁定的方法詳解
說明
Websocket是html5后的產(chǎn)物,對于asp.net core中也得到了支持,Asp.Net Core中WebScoket的操作使用基本上和Asp.net中相同,不同的是,綁定監(jiān)聽。
Asp.Net Core2.0默認(rèn)已經(jīng)支持WebSocket,不需要另外安裝Nuget包。
通過對HttpContext中的WebSockets.AcceptWebSocketAsync方法,接受WebSocket請求;并返回WebScoket對象。
下面話不多說了,來一起看看詳細(xì)的介紹吧。
一、示例1,
1.后臺(tái)啟動(dòng)文件Startup的configure中綁定WebSocket的路由監(jiān)聽
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider svp) { ...... //綁定WebSocket app.Map("/wsone/Connect", (con) => { con.UseWebSockets(); WSHanleTwo _two = new WSHanleTwo(); con.Use(_two.Connect); }); }
2.定義請求處理類
using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; namespace Core_Razor_2 { public class WSHanleTwo { private WebSocket socket = null; //創(chuàng)建鏈接 public async Task Connect(HttpContext context, Func<Task> n) { try { //執(zhí)行接收 WebSocket socket = await context.WebSockets.AcceptWebSocketAsync(); this.socket = socket; //執(zhí)行監(jiān)聽 await EchoLoop(); } catch (Exception ex) { throw ex; } } /// <summary> /// 響應(yīng)處理 /// </summary> /// <returns></returns> async Task EchoLoop() { var buffer = new byte[1024]; var seg = new ArraySegment<byte>(buffer); while (this.socket.State == WebSocketState.Open) { var incoming = await this.socket.ReceiveAsync(seg, CancellationToken.None); byte[] backInfo = System.Text.UTF8Encoding.Default.GetBytes("服務(wù)端相應(yīng)內(nèi)容"); var outgoing = new ArraySegment<byte>(backInfo, 0, incoming.Count); await this.socket.SendAsync(outgoing, WebSocketMessageType.Text, true, CancellationToken.None); } } } }
3.前臺(tái)請求代碼
var socket; //var uri = "ws://" + window.location.host + "/ws"; var uri = "ws://" + window.location.host + "@Url.Action("Connect")"; var output; var text = "test echo"; function write(s) { var p = document.createElement("p"); p.innerHTML = s; output.appendChild(p); } function doConnect() { socket = new WebSocket(uri); socket.onopen = function (e) { write("opened " + uri); doSend(); }; socket.onclose = function (e) { write("closed"); }; socket.onmessage = function (e) { write("Received: " + e.data); socket.close(); }; socket.onerror = function (e) { write("Error: " + e.data); }; } function doSend() { write("Sending: " + text); socket.send(text); } function onInit() { output = document.getElementById("output"); doConnect(); } window.onload = onInit;
二、為了簡單綁定,可以這樣封裝
public class SocketHandler { public const int BufferSize = 4096; WebSocket socket; SocketHandler(WebSocket socket) { this.socket = socket; } async Task EchoLoop() { var buffer = new byte[BufferSize]; var seg = new ArraySegment<byte>(buffer); while (this.socket.State == WebSocketState.Open) { var incoming = await this.socket.ReceiveAsync(seg, CancellationToken.None); var outgoing = new ArraySegment<byte>(buffer, 0, incoming.Count); await this.socket.SendAsync(outgoing, WebSocketMessageType.Text, true, CancellationToken.None); } } static async Task Acceptor(HttpContext hc, Func<Task> n) { if (!hc.WebSockets.IsWebSocketRequest) return; var socket = await hc.WebSockets.AcceptWebSocketAsync(); var h = new SocketHandler(socket); await h.EchoLoop(); } /// <summary> /// 路由綁定處理 /// </summary> /// <param name="app"></param> public static void Map(IApplicationBuilder app) { app.UseWebSockets(); app.Use(SocketHandler.Acceptor); } }
路由綁定:
[csharp] view plain copy //綁定websocket app.Map("/ws", SocketHandler.Map);
Asp.Net Core上傳控件:http://xiazai.jb51.net/201712/yuanma/Uploader(jb51.net).rar
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
ASP.NET 定制簡單的錯(cuò)誤處理頁面實(shí)現(xiàn)代碼
通常web應(yīng)用程序在發(fā)布后,為了給用戶一個(gè)友好界面和使用體驗(yàn),都會(huì)在錯(cuò)誤發(fā)生時(shí)跳轉(zhuǎn)至一個(gè)自定義的錯(cuò)誤頁面,而不是asp.net向用戶暴露出來的詳細(xì)的異常列表。2010-01-01ASP.NET動(dòng)態(tài)增加HTML元素的方法實(shí)例小結(jié)
這篇文章主要介紹了ASP.NET動(dòng)態(tài)增加HTML元素的方法,結(jié)合實(shí)例形式總結(jié)分析了asp.net針對樣式、Meta、js等元素動(dòng)態(tài)增加相關(guān)操作技巧,需要的朋友可以參考下2017-01-01DataTable轉(zhuǎn)成字符串復(fù)制到txt文本的小例子
DataTable轉(zhuǎn)成字符串復(fù)制到txt文本的小例子,需要的朋友可以參考一下2013-03-03