我有两个C#程序,应该通过WebSockets通信。服务器完美地工作(也使用Alchemy),已经有一段时间了(使用javascript客户端)。然而,连接一个Alchemy WebSocketClient会在客户端上抛出NullReferenceException异常。在进行一些调试后,我发现异常是在
WebSocketClient.cs
的第187行抛出的,因为调用了_context.Connection.Connected
。_context.Connection与本地的_client
是同一个实例,在那个时刻都不为null。在msdn.microsoft.com的TcpClient.Connected页面上没有列出任何可能的异常(这表明它不应该抛出任何异常)。更进一步,我注意到_client
类变量在WebSocketClient.cs
的第176行被改变,从一个正常的实例变成一个充满异常的实例:
就在这一行之后,刚刚添加到第187行的Context
的Dispose()方法被调用,断开了Connection
(它是与我之前在第131行提到的_client
相同的实例,在Context.cs
中)。
我的问题是:为什么会发生这种情况,如何阻止它发生并成功连接所需的WebSocketServer?
如果您需要更多信息,请不要犹豫在评论中向我提问。
编辑1
只有当服务器实际在监听时,异常才会发生。如果服务器处于非活动状态,则不会到达WebSocketClient.cs
的第176行(这是正确的行为,因为当与服务器建立连接时会调用OnRunClient()
)。
编辑2
如请求的堆栈跟踪:System.NullReferenceException was unhandled
HResult=-2147467261
Message=Object reference not set to an instance of an object.
Source=System
StackTrace:
at System.Net.Sockets.TcpClient.get_Connected()
at Alchemy.WebSocketClient.SetupContext(Context context) in C:\...\Alchemy\WebSocketClient.cs:regel 187
at Alchemy.WebSocketClient.HandleClientThread() in C:\...\Alchemy\WebSocketClient.cs:regel 94
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException: