传输了几条消息后,ASP.NET MVC 4.5 WebSocket 服务器失去连接

Posted

技术标签:

【中文标题】传输了几条消息后,ASP.NET MVC 4.5 WebSocket 服务器失去连接【英文标题】:ASP.NET MVC 4.5 WebSocket server loses connection after a few messages have been transferred 【发布时间】:2014-01-29 13:12:04 【问题描述】:

我刚刚开始使用 WebSockets 和 ASP.NET 并遇到了一个奇怪的问题。我正在构建一个非常原始的 ASP.NET 4.5 WebAPI 应用程序,它应该像这样用作回声服务器:

using Microsoft.Web.WebSockets;
// ...

namespace MyControllers

    internal class EchoHandler : WebSocketHandler
    
        public override void OnClose()
        
            System.Diagnostics.Debug.Write("Close"); 
        

        public override void OnError()
        
            System.Diagnostics.Debug.Write("Error: " + this.Error.ToString()); 
        

        public override void OnOpen()
        
            System.Diagnostics.Debug.Write("Open"); 
        

        public override void OnMessage(string message)
        
            System.Diagnostics.Debug.Write("Message: " + message);
            this.Send("Echo: " + message);
        
    

    public class EchoController : ApiController
    
        public HttpResponseMessage Get()
        
            if (HttpContext.Current.IsWebSocketRequest)
            
                HttpContext.Current.AcceptWebSocketRequest(new EchoHandler());
                return Request.CreateResponse(HttpStatusCode.SwitchingProtocols);
            
            else
            
                return Request.CreateResponse(HttpStatusCode.BadRequest);
            
        
    

我正在使用用 C# 编写的 Windows 应用商店应用程序连接到此服务。相关代码如下所示:

class WebsocketTest

    private MessageWebSocket webSocket;
    private DataWriter messageWriter;

    private async Task Connect()
    
        var server = new Uri("ws://127.0.0.1:81/");

        webSocket = new MessageWebSocket();
        webSocket.Control.MessageType = SocketMessageType.Utf8;
        webSocket.MessageReceived += messageWebSocket_MessageReceived;
        webSocket.Closed += messageWebSocket_Closed;

        await webSocket.ConnectAsync(server);
        messageWebSocket = webSocket;
        messageWriter = new DataWriter(webSocket.OutputStream);
    

    private async Task Send(string message)
    
        try
        
            messageWriter.WriteString(message);

            await messageWriter.StoreAsync();
        
        catch (Exception ex)
        
            var error = WebSocketError.GetStatus(ex.GetBaseException().HResult);
        
    

这在一段时间内运行良好,但是在来回发送任意数量的消息后,在服务器上调用 OnError() 并且我收到以下异常:“I/O 操作已中止,因为线程退出或应用程序请求”(似乎是“this.Send(...)”导致它)。如果我继续在客户端上发送内容,则在调用“dataWriter.StoreAsync()”时会收到“ConnectionAborted”错误。 错误每次都会发生,但在它发生之前需要不同数量的消息。使用更长的消息似乎可以加快这个过程。

为了测试,我还尝试使用普通的 AspNetWebSockets 而不是 WebSocketHandler,但结果相同。

有什么想法吗?

提前非常感谢, 启

【问题讨论】:

【参考方案1】:

这是一个错误(由我报告):https://connect.microsoft.com/VisualStudio/feedbackdetail/view/976851/server-websocket-closed-abruptly-the-i-o-operation-has-been-aborted-because-of-either-a-thread-exit-or-an-application-request

很长一段时间以来,我一直试图找到一种解决方法,但没有成功。我正在使用HttpListener,但症状是一样的。现在我已将实现更改为第三方库,问题似乎已经解决。

【讨论】:

以上是关于传输了几条消息后,ASP.NET MVC 4.5 WebSocket 服务器失去连接的主要内容,如果未能解决你的问题,请参考以下文章

跟我一起学习ASP.NET 4.5 MVC4.0

Response.WriteFile() - 不工作 asp net mvc 4.5

如何使用 MVC3 ASP.NET 4.5 和 EF6 基于实体属性注释对 TextBoxFor 进行舍入

ASP.Net 4.5 注销/登录失败

XSP 可以运行 ASP.NET 4.5 吗?

ASP.NET 4.5 Web API 2.0,JWT 消息处理程序将状态 0 返回到 Angular 7 HTTP 拦截器