视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Asp.Net Core中WebSocket绑定的方法详解
2020-11-27 22:35:13 责编:小采
文档

说明

Websocket是html5后的产物,对于asp.net core中也得到了支持,Asp.Net Core中WebScoket的操作使用基本上和Asp.net中相同,不同的是,绑定监听。

Asp.Net Core2.0默认已经支持WebSocket,不需要另外安装Nuget包。

通过对HttpContext中的WebSockets.AcceptWebSocketAsync方法,接受WebSocket请求;并返回WebScoket对象。

下面话不多说了,来一起看看详细的介绍吧。

一、示例1,

1.后台启动文件Startup的configure中绑定WebSocket的路由监听

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; 
 //创建链接 
 public async Task Connect(HttpContext context, Func<Task> n) 
 { 
 try 
 { 
 //执行接收 
 WebSocket socket = await context.WebSockets.AcceptWebSocketAsync(); 
 this.socket = socket; 
 //执行监听 
 await EchoLoop(); 
 } 
 catch (Exception ex) 
 { 
 throw ex; 
 } 
 } 
 /// <summary> 
 /// 响应处理 
 /// </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("服务端相应内容"); 
 var outgoing = new ArraySegment<byte>(backInfo, 0, incoming.Count); 
 await this.socket.SendAsync(outgoing, WebSocketMessageType.Text, true, CancellationToken.None); 
 } 
 } 
 } 
} 

3.前台请求代码

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

总结

下载本文
显示全文
专题