Asp.Net Core中WebSocket绑定的方法详解
|
说明 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,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,incoming.Count);
await this.socket.SendAsync(outgoing,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 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。 (编辑:日照站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net下创建、查询、修改带名称空间的 XML 文件的例子
- asp.net core标签助手的高级用法TagHelper+Form
- ASP.Net核心 – 获取帖子表格的所有数据
- asp.net-mvc – 单元测试中的ViewResult.ViewName属性为空
- asp.net-mvc-4 – AngularJs,DropZone.Js,MVC4 – 拖放,预览
- ASP.NET MVC编辑器模板和Html.EditorFor(…) – 如何消除类
- asp.net – VS插件:查看标记.存在这样的事情吗?
- asp.net – HttpWebRequest正在为404抛出异常
- asp.net-mvc-3 – 使用自定义VirtualPathProvider加载嵌入式
- asp.net – 适用于多个用户的EWS通知中心
- asp.net-mvc – 针对SAAS的多租户客户端特定定制
- asp.net – 如何正确地大写希腊字在.NET?
- asp.net – 使用umbraco的iis应用程序池使用过多
- 在ASP.NET RadioButtonList ListItem上设置CSS类
- asp.net – IIS Express(WebMatrix)打开外部连接
- asp.net-mvc – ASP.net MVC DropDownList预选项
- asp.net-mvc – MVC会话过期而不是身份验证
- asp.net中js+jquery添加下拉框值和后台获取示例
- asp.net – 多个用户控件和JavaScript
- asp.net-mvc – 如何在ASP.NET MVC中生成弹出页面
