c# – 在MVC控制器中打开一个websocket通道

前端之家收集整理的这篇文章主要介绍了c# – 在MVC控制器中打开一个websocket通道前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有人在MVC控制器中打开websocket连接有任何好的经验吗?

技术栈:ASPNET Core 1.0(RC1)MVC,dnx46,System.Net.WebSockets

为什么MVC而不是中间件:为了整体一致性,路由,已经注入的存储库,在同一个控制器中调用私有方法的选项.

[HttpGet("v1/resources/{id}")]
public async Task<IActionResult> GetAsync(string id)
{
    var resource = await this.repository.GetAsync(id);
    if (resource == null)
    {
        return new HttpStatusCodeResult(404);
    }

    if (this.HttpContext.WebSockets.IsWebSocketRequest)
    {
        var webSocket = await this.HttpContext.WebSockets.AcceptWebSocketAsync();
        if (webSocket != null && webSocket.State == WebSocketState.Open)
        {
            while (true)
            {
                var response = string.Format("Hello! Time {0}",System.DateTime.Now.ToString());
                var bytes = System.Text.Encoding.UTF8.GetBytes(response);

                await webSocket.SendAsync(new System.ArraySegment<byte>(bytes),WebSocketMessageType.Text,true,CancellationToken.None);

                await Task.Delay(2000);
            }
        }
    }

    return new HttpStatusCodeResult(101);           
}

问题:是否有任何已知的缺点,而不是处理中间件中的Websocket连接?握手的方式,除了返回HTTP 101状态码之外,还需要做其他任何事情吗?

更新1:为什么不是SignalR?没有必要使用回退技术,所以虽然它是一个好的产品,但是在这种情况下,没有增加附加依赖性的益处.

更新2:我已经注意到了一个缺点 – 当while(true)存在时(出于简单的原因,上面的例子中没有显示,让我们说,当一个通道需要关闭时),这些方法需要返回一些任务).应该是什么HTTP 200状态响应?我猜没有,因为在WebSockets文档中写入,在“关闭”框架之后不应该发送任何内容.

更新3:有一件事,我学到了很多方法,如果要在Windows 10中使用IIS Express 10.0在Visual Studio 2015中调试WebSockets时工作,您仍然必须使用https://github.com/aspnet/WebSockets并在启动时配置app.UseWebSockets(). cs文件.否则,IsWebSocketRequest将为false.有人知道为什么握手?

解决方法

似乎很好

>你可能想将while(true)更改为(!HttpContext.RequestAborted.IsCancellationRequested),以便您检测到客户端断开连接并结束请求.
>您不需要检查null或在您调用accept后的websocket的状态.

我假设所有的代码都是暂时的,你实际上会从websocket中读取一些东西.

所有通常的websocket规则适用:

>使用SSL(当您托管它时)>它不会在多个服务器上工作(这是一个点到套接字连接)>您需要支持处理部分帧.如果您知道客户端不会发送任何信息,您可以查看.

猜你在找的C#相关文章