c# - WebSocket 通信抛出 System.ObjectDisposedException

标签 c# asp.net websocket objectdisposedexception

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

我提出了一组不同大小的请求,每个请求之间有几秒钟的时间间隔。前三个正确通过,但一个精确的,另一个没有任何特别之处,关闭 WebSocket 连接,在服务器端抛出异常。

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

FATAL ERROR: Cannot access a disposed object.
Object name: 'System.Web.WebSockets.AspNetWebSocket'.
at System.Web.WebSockets.AspNetWebSocket.ThrowIfDisposed()
at System.Web.WebSockets.AspNetWebSocket.SendAsyncImpl(ArraySegment 1 buffer, WebSocketMessageType messageType, Boolean endOfMessage, CancellationToken cancellationToken, Boolean performValidation)
at System.Web.WebSockets.AspNetWebSocket.SendAsync(ArraySegment 1 buffer, WebSocketMessageType messageType, Boolean endOfMessage, CancellationToken cancellationToken)
at [my code path here...]

这可能是线程问题,因为我在与 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 */);
        }
    }

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

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

更新:

经过多次测试,我没有时不时出现这个异常。我总是做同样的事情,但服务器似乎有一个随机的行为。

这让我的问题更奇怪了......

最佳答案

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

我的问题是我将 WebSockets 存储在与主机名链接的字典中。因此,在我的服务器上首次连接客户端时,一切正常。但是如果我刷新页面,websocket 被服务器关闭(因为没有机会再次使用它)并且创建了另一个。

但由于我对两个套接字(已弃用的套接字和新的套接字)使用了相同的 key ,我试图用以前的套接字回答新客户端,该套接字已关闭。 (已处置 = 对于 ASP.NET 已关闭)。

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

我没有提到我将套接字与主机名链接的部分,所以我承认你帮不了我......我很抱歉。

关于c# - WebSocket 通信抛出 System.ObjectDisposedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29944233/

相关文章:

ssl - WebSocket 连接失败 ERR_SSL_PROTOCOL_ERROR

c# - protobuf-net 序列化返回空数组

javascript - 使用 Ajax 和 $.each 获取复选框的值

asp.net - Javascript : Enter Key Press

html - 将 CSS 类应用于 gridview 不起作用

authentication - Websocket、Angular 2 和 JSON Web token 身份验证

c# - JSON.NET JObject - 我如何从这个嵌套的 JSON 结构中获取值(value)

c# - 在 DataGridView 中读取 CSV 文件

c# 泛型属性

javascript - WebSocket 握手 : Unexpected response code: 404