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),以便您检测到客户端断开连接并结束请求. 我假设所有的代码都是暂时的,你实际上会从websocket中读取一些东西. 所有通常的websocket规则适用: >使用SSL(当您托管它时)>它不会在多个服务器上工作(这是一个点到套接字连接)>您需要支持处理部分帧.如果您知道客户端不会发送任何信息,您可以查看. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |