System.ObjectDisposedException引发了WebSocket通信

时间:2015-04-29 12:48:59

标签: c# asp.net websocket objectdisposedexception

我正在尝试使用WebSockets在Web浏览器客户端和ASP.NET服务器之间进行通信。

我制作了一组不同大小的请求,每个请求之间经过了几秒钟的时间。三个第一个正确传递,但是精确的一个,没有特别是另一个,关闭WebSocket连接,在服务器端抛出异常。

此异常的错误消息和堆栈跟踪如下所示:

  

致命错误:无法访问已处置的对象   对象名:'System.Web.WebSockets.AspNetWebSocket'。
    在System.Web.WebSockets.AspNetWebSocket.ThrowIfDisposed()
    在System.Web.WebSockets.AspNetWebSocket.SendAsyncImpl(ArraySegment 1 buffer,WebSocketMessageType messageType,Boolean endOfMessage,CancellationToken cancellationToken,Boolean performValidation)
    在System.Web.WebSockets.AspNetWebSocket.SendAsync(ArraySegment 1 buffer,WebSocketMessageType messageType,Boolean endOfMessage,CancellationToken cancellationToken)
    在[我的代码路径...]

这可能是一个线程问题,因为我在与websockets通信的函数中使用async方法。

我知道这个代码(socket.SendAsync)抛出异常:

public class SocketTranslater
{

    private WebSocket socket;
    private JavaScriptSerializer serializer;

    // [...]

    private ArraySegment<byte> Encode(Object data)
    {
        string json = serializer.Serialize(data);
        return (new ArraySegment<byte>(Encoding.UTF8.GetBytes(json)));
    }


    public async Task Send(Object packet)
    {
        ArraySegment<byte> encoded = this.Encode(packet);

        await socket.SendAsync(encoded, WebSocketMessageType.Text, true, CancellationToken.None);
    }
}

套接字是从另一个类创建的:

public class EventSender : IHttpHandler
{
    private static List<SocketTranslater> socketTranslaters = new List<SocketTranslater>();

    public void ProcessRequest(HttpContext context)
    {
        this.id = context.Request.UserHostName + ":" + context.Request.UserAgent;
        if (context.IsWebSocketRequest)
        {
            context.AcceptWebSocketRequest(ProcessSocket);
        }        
    }

    private async Task ManageSocket(AspNetWebSocketContext context)
    {
        WebSocket socket = context.WebSocket;
        SocketTranslater translater = new SocketTranslater(socket);
        translaters.add(translater);

        while (true)
        {
            // Manage messages, using the other class to send responses.
            translater.Send(/* Any struct here */);
        }
    }

不可思议的是,我的项目太大了,无法将所有代码放在这里。

您是否需要错误来源或其他信息?

更新

经过多次测试后,我不时有这个例外。我总是做同样的事情,但服务器似乎有一个随机的组合。

这使我的问题更奇怪......

1 个答案:

答案 0 :(得分:1)

最后,经过一些更多的测试和有趣的问题以及答案(如this one),我明白了:

我的问题是我在与主机名链接的字典中存放WebSockets。所以在我服务器上客户端的第一个连接上,一切正常。但是如果我刷新页面,那么websocket就会被服务器关闭(因为没有机会再次使用它),而另一个则被创建了。

但是当我对两个套接字使用相同的密钥,不推荐使用的密钥和新的套接字时,我试图用前一个套接字来回答新客户端,该套接字已关闭。 (dispos =关闭ASP.NET)。

所以我唯一需要做的就是在客户端断开连接的列表中删除套接字(在ManageSocket的末尾)。并禁止客户端使用相同的主机名连接两次。

我没有提到我将套接字与主机名链接的部分,所以我承认你无法真正帮助我......我道歉。