Ara*_*hor 5 c# asp.net objectdisposedexception websocket
我正在尝试使用WebSockets在Web浏览器客户端和ASP.NET服务器之间进行通信.
我制作了一组不同大小的请求,每个请求之间经过了几秒钟的时间.三个第一个正确传递,但是精确的一个,没有特别是另一个,关闭WebSocket连接,在服务器端抛出异常.
此异常的错误消息和堆栈跟踪如下所示:
致命错误:无法访问已处置的对象.
对象名:'System.Web.WebSockets.AspNetWebSocket'.
在System.Web.WebSockets.AspNetWebSocket.ThrowIfDisposed()
在System.Web.WebSockets.AspNetWebSocket.SendAsyncImpl(ArraySegment 1个缓冲器,WebSocketMessageType为messageType,布尔endOfMessage,的CancellationToken的CancellationToken,布尔performValidation)
在System.Web.WebSockets.AspNetWebSocket.SendAsync(
在[我的代码路径这里...]的ArraySegment 1缓冲区,WebSocketMessageType messageType,Boolean endOfMessage,CancellationToken cancellationToken)
这可能是一个线程问题,因为我在使用async与websockets通信的函数的各处使用方法.
我知道这个代码(at 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);
}
}
Run Code Online (Sandbox Code Playgroud)
套接字是从另一个类创建的:
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 */);
}
}
Run Code Online (Sandbox Code Playgroud)
不可思议的是,我的项目太大了,无法将所有代码放在这里.
您是否需要错误来源或其他信息?
更新:
经过一些更多的测试,我不时有这个例外.我总是做同样的事情,但服务器似乎有一个随机的comportment.
这使我的问题更奇怪......
最后,经过一些更多的测试和有趣的问题以及这里的回答(比如这个),我明白了:
我的问题是我将 WebSockets 存储在与主机名链接的字典中。因此,在我的服务器上的客户端第一次连接时,一切正常。但是如果我刷新页面,Websocket 就会被服务器关闭(因为没有机会再次使用它),并且创建了另一个 Websocket。
但是,由于我对两个套接字(已弃用的套接字和新套接字)使用相同的密钥,因此我尝试使用已关闭的前一个套接字来回答新客户端。(已处置 = ASP.NET 已关闭)。
因此,我唯一要做的就是在客户端断开连接时从列表中删除套接字(在 的末尾ManageSocket)。并禁止客户端使用相同的主机名连接两次。
我没有提到我将套接字与主机名链接的部分,所以我承认你不能真正帮助我......我很抱歉。
| 归档时间: |
|
| 查看次数: |
1605 次 |
| 最近记录: |