当服务器上抛出远程处理异常时,出现套接字关闭错误
我有一个使用 .Net 远程处理构建的应用程序。 身份验证时,如果出现错误,我会在服务器上抛出异常。 该异常是可序列化的。 但是,当服务器上引发异常时,有时我会在客户端看到错误,提示“已建立的连接被主机中的软件中止”。
这是我在尝试调试服务器时从 Windbg 获得的堆栈跟踪。 看起来远程处理框架正在这样做。 关于为什么套接字被关闭以及如何处理这个问题有什么想法吗?
System.Net.Sockets.Socket.Close() System.Runtime.Remoting.Channels.SocketHandler.Close() System.Runtime.Remoting.Channels.SocketHandler.CloseOnFatalError(System.Exception) System.Runtime.Remoting.Channels.SocketHandler.ProcessRequestNow() System.Runtime.Remoting.Channels.RequestQueue.ProcessNextRequest(System.Runtime.Remoting.Channels.SocketHandler) System.Runtime.Remoting.Channels.SocketHandler.BeginReadMessageCallback(System.IAsyncResult) System.Net.LazyAsyncResult.Complete(IntPtr) System.Net.ContextAwareResult.CompleteCallback(System.Object) System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) System.Net.ContextAwareResult.Complete(IntPtr) System.Net.LazyAsyncResult.ProtectedInvokeCallback(System.Object, IntPtr) System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32, UInt32, System.Threading.NativeOverlapped*) System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
I have an app that is built using .Net remoting. When authenticating, If there is an error, I threw an exception on the server. The exception is serializable. But when the exception is thrown on the server, Sometimes I see an error on the client side that says "An established connection was aborted by the software in your host machine".
This is the stack trace I have from windbg when try to debug the server. Looks like the remoting framework is doing that. Any ideas as to why the socket is being closed and how to handle this?
System.Net.Sockets.Socket.Close() System.Runtime.Remoting.Channels.SocketHandler.Close() System.Runtime.Remoting.Channels.SocketHandler.CloseOnFatalError(System.Exception) System.Runtime.Remoting.Channels.SocketHandler.ProcessRequestNow() System.Runtime.Remoting.Channels.RequestQueue.ProcessNextRequest(System.Runtime.Remoting.Channels.SocketHandler) System.Runtime.Remoting.Channels.SocketHandler.BeginReadMessageCallback(System.IAsyncResult) System.Net.LazyAsyncResult.Complete(IntPtr) System.Net.ContextAwareResult.CompleteCallback(System.Object) System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) System.Net.ContextAwareResult.Complete(IntPtr) System.Net.LazyAsyncResult.ProtectedInvokeCallback(System.Object, IntPtr) System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32, UInt32, System.Threading.NativeOverlapped*) System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
每次抛出远程异常时,.Net 远程处理框架都会关闭套接字吗? 从使用WinDbg调试来看,情况就是如此。 有人可以证实这一点吗? 另外,是否有时在发送响应后关闭套接字,有时在发送响应之前关闭套接字,具体取决于特定情况?
这是当我没有得到“已建立的连接被主机中的软件中止”时来自客户端的 Windbg 的跟踪。 在这种情况下,我收到远程处理异常
这是当我收到错误“已建立的连接被主机中的软件中止”时的跟踪。 在这种情况下,我收到套接字错误。
在服务器上抛出异常的是我们负责安全的自定义接收器。 我可以直接将代码发布在一个地方。
Is it the case that the .Net remoting framework closes the socket everytime a remoting exception is thrown? from debugging using WinDbg, that looks to the case. Could some one confirm this? Also, Is it the case some times the socket is closed after the reponse is sent and sometimes the socket is closed before the response is sent depending on an particular scenario?
This is trace from windbg on the client side when I don't get that "An established connection was aborted by the software in your host machine". In this case, I get a remoting exception
This is the trace when I get that error "An established connection was aborted by the software in your host machine". In this case I get a socket error.
And the one that is throwing the exception on the server is our custom sink that takes care of security. I could have posted the code If it as in one place and straight forward.