ASP.NET Core 中的 WebSocket 支持(转自MSDN)

时间:2018-10-19 01:52:45   收藏:0   阅读:226

本文介绍 ASP.NET Core 中 WebSocket 的入门方法。 WebSocket (RFC 6455) 是一个协议,支持通过 TCP 连接建立持久的双向信道。 它用于从快速实时通信中获益的应用,如聊天、仪表板和游戏应用。

如果不明白什么是WebSocket可以参考这篇文章

 

系统必备


 

何时使用 WebSocket


 通过 WebSocket 可直接使用套接字连接。 例如,使用 WebSocket 可以让实时游戏达到最佳性能。

ASP.NET Core SignalR 是一个库,可用于简化向应用添加实时 Web 功能。 它会尽可能地使用 WebSocket。

 

如何使用 Websocket


配置中间件

Startup 类的 Configure 方法中添加 WebSocket 中间件:

app.UseWebSockets();

可配置以下设置:

var webSocketOptions = new WebSocketOptions()
{
    KeepAliveInterval = TimeSpan.FromSeconds(120),
    ReceiveBufferSize = 4 * 1024
};
app.UseWebSockets(webSocketOptions);

 

接受 WebSocket 请求

在请求生命周期后期(例如在 Configure 方法或 MVC 操作的后期,实际上下面的app.Use我觉得应该放在Configure 方法中的app.UseMvc之前,否则请求就被MVC的中间件先执行了),检查它是否是 WebSocket 请求并接受 WebSocket 请求。
以下示例来自 Configure 方法的后期:

app.Use(async (context, next) =>
{
    if (context.Request.Path == "/ws")
    {
        if (context.WebSockets.IsWebSocketRequest)
        {
            WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
            await Echo(context, webSocket);
        }
        else
        {
            context.Response.StatusCode = 400;
        }
    }
    else
    {
        await next();
    }

});

WebSocket 请求可以来自任何 URL,但此示例代码只接受 /ws 路径的请求。

 

发送和接收消息

AcceptWebSocketAsync 方法将 TCP 连接升级到 WebSocket 连接,并提供 WebSocket 对象。 使用 WebSocket 对象发送和接收消息。
之前显示的接受 WebSocket 请求的代码将 WebSocket 对象传递给 Echo 方法。 代码接收消息并立即发回相同的消息。 循环发送和接收消息,直到客户端关闭连接:

private async Task Echo(HttpContext context, WebSocket webSocket)
{
    var buffer = new byte[1024 * 4];
    WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
    while (!result.CloseStatus.HasValue)
    {
        //个人觉得实际上可以将下面的webSocket.SendAsync方法放到一个Task里面,来启动另一个线程然后在内部不断循环来处理发送数据的任务,避免和下面的webSocket.ReceiveAsync轮流执行,从而提高效率
        await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);

        result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
    }
    await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
}

如果在开始循环之前接受 WebSocket 连接,中间件管道会结束。 关闭套接字后,管道展开。 即接受 WebSocket 时,请求停止在管道中推进。 循环结束且套接字关闭时,请求继续回到管道。

 

 

IIS/IIS Express 支持


安装了 IIS/IIS Express 8 或更高版本的 Windows Server 2012 或更高版本以及 Windows 8 或更高版本支持 WebSocket 协议。
在 Windows Server 2012 或更高版本上启用对 WebSocket 协议的支持:

  1. 通过“管理”菜单或“服务器管理器”中的链接使用“添加角色和功能”向导。
  2. 选择“基于角色或基于功能的安装”。 选择“下一步”。
  3. 选择适当的服务器(默认情况下选择本地服务器)。 选择“下一步”。
  4. 在“角色”树中展开“Web 服务器 (IIS)”、然后依次展开“Web 服务器”和“应用程序开发”。
  5. 选择“WebSocket 协议”。 选择“下一步”。
  6. 如果无需其他功能,请选择“下一步”。
  7. 选择“安装” 。
  8. 安装完成后,选择“关闭”以退出向导。

在 Windows 8 或更高版本上启用对 WebSocket 协议的支持:

  1. 导航到“控制面板” > “程序” > “程序和功能” > “打开或关闭 Windows 功能”(位于屏幕左侧)。
  2. 打开以下节点:“Internet Information Services” > “万维网服务” > “应用程序开发功能”。
  3. 选择“WebSocket 协议”功能。 选择“确定”。

在 node.js 上使用 socket.io 时禁用 WebSocket
如果在 Node.js 的 socket.io 中使用 WebSocket 支持,请使用 web.config 或 applicationHost.config 中的 webSocket 元素禁用默认的 IIS WebSocket 模块。如果不执行此步骤,IIS WebSocket 模块将尝试处理 WebSocket 通信而不是 Node.js 和应用。

<system.webServer>
  <webSocket enabled="false" />
</system.webServer>

 

原文链接

 

原文:https://www.cnblogs.com/OpenCoder/p/9813918.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!