有人在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.有人知道为什么握手?