我有一个使用.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*)
答案 0 :(得分:1)
每次抛出远程异常时,.Net远程处理框架是否会关闭套接字?从调试使用WinDbg,看起来如此。有人可以证实这一点吗?此外,有时候在发送响应之后套接字关闭,有时套接字在发送响应之前关闭,具体取决于特定情况吗?
这是来自客户端windbg的跟踪,当我没有得到“已建立的连接被主机中的软件中止”。在这种情况下,我得到一个远程异常
06d2f45c 7c812aeb [HelperMethodFrame: 06d2f45c] 06d2f500 7a5ff43e System.Net.Sockets.Socket.Receive(Byte[], Int32, Int32, System.Net.Sockets.SocketFlags) 06d2f51c 67777fb0 System.Runtime.Remoting.Channels.SocketStream.Read(Byte[], Int32, Int32) 06d2f530 67777b12 System.Runtime.Remoting.Channels.SocketHandler.ReadFromSocket(Byte[], Int32, Int32) 06d2f540 67777aea System.Runtime.Remoting.Channels.SocketHandler.BufferMoreData() 06d2f548 67777a7c System.Runtime.Remoting.Channels.SocketHandler.Read(Byte[], Int32, Int32) 06d2f56c 67777998 System.Runtime.Remoting.Channels.SocketHandler.ReadAndMatchFourBytes(Byte[]) 06d2f578 67783199 System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadVersionAndOperation(UInt16 ByRef) 06d2f598 67783ece System.Runtime.Remoting.Channels.Tcp.TcpClientSocketHandler.ReadHeaders() 06d2f5b4 67782456 System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(System.Runtime.Remoting.Messaging.IMessage, System.Runtime.Remoting.Channels.ITransportHeaders, System.IO.Stream, System.Runtime.Remoting.Channels.ITransportHeaders ByRef, System.IO.Stream ByRef) 06d2f5d0 06e61bdf com.imageright.security.remoting.IdentityClientSink.ProcessMessage(System.Runtime.Remoting.Messaging.IMessage, System.Runtime.Remoting.Channels.ITransportHeaders, System.IO.Stream, System.Runtime.Remoting.Channels.ITransportHeaders ByRef, System.IO.Stream ByRef) 06d2f5f0 6778ae69 System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(System.Runtime.Remoting.Messaging.IMessage) 06d2f62c 793c319f System.Runtime.Remoting.Proxies.RemotingProxy.CallProcessMessage(System.Runtime.Remoting.Messaging.IMessageSink, System.Runtime.Remoting.Messaging.IMessage, System.Runtime.Remoting.Contexts.ArrayWithSize, System.Threading.Thread, System.Runtime.Remoting.Contexts.Context, Boolean) 06d2f650 793c2f82 System.Runtime.Remoting.Proxies.RemotingProxy.InternalInvoke(System.Runtime.Remoting.Messaging.IMethodCallMessage, Boolean, Int32) 06d2f6b4 793c2db9 System.Runtime.Remoting.Proxies.RemotingProxy.Invoke(System.Runtime.Remoting.Messaging.IMessage) 06d2f6c4 79374dc3 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(System.Runtime.Remoting.Proxies.MessageData ByRef, Int32) 06d2f960 79f98b43 [TPMethodFrame: 06d2f960] com.imageright.server.IInstrumentation.GetEnterpriseID() 06d2f970 06e618ee imageright.proxies_com.imageright.server.IInstrumentationProxy.GetEnterpriseID() 06d2f9c4 069fddae ImageRight.EMC.EnterpriseNode.EstablishConnection() 06d2fa00 069fdce7 ImageRight.EMC.RootNode.TryOpenConnections(System.Object) 06d2fa38 79407caa System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(System.Object) 06d2fa3c 79373ecd System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 06d2fa54 79407e18 System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(System.Threading._ThreadPoolWaitCallback) 06d2fa68 79407d90 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(System.Object) 06d2fbf8 79e7c74b [GCFrame: 06d2fbf8]
当我收到错误“已建立的连接被主机中的软件中止”时,这是跟踪。在这种情况下,我收到套接字错误。
06d2f45c 7c812aeb [HelperMethodFrame: 06d2f45c] 06d2f500 7a5ff43e System.Net.Sockets.Socket.Receive(Byte[], Int32, Int32, System.Net.Sockets.SocketFlags) 06d2f51c 67777fb0 System.Runtime.Remoting.Channels.SocketStream.Read(Byte[], Int32, Int32) 06d2f530 67777b12 System.Runtime.Remoting.Channels.SocketHandler.ReadFromSocket(Byte[], Int32, Int32) 06d2f540 67777aea System.Runtime.Remoting.Channels.SocketHandler.BufferMoreData() 06d2f548 67777a7c System.Runtime.Remoting.Channels.SocketHandler.Read(Byte[], Int32, Int32) 06d2f56c 67777998 System.Runtime.Remoting.Channels.SocketHandler.ReadAndMatchFourBytes(Byte[]) 06d2f578 67783199 System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadVersionAndOperation(UInt16 ByRef) 06d2f598 67783ece System.Runtime.Remoting.Channels.Tcp.TcpClientSocketHandler.ReadHeaders() 06d2f5b4 67782456 System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(System.Runtime.Remoting.Messaging.IMessage, System.Runtime.Remoting.Channels.ITransportHeaders, System.IO.Stream, System.Runtime.Remoting.Channels.ITransportHeaders ByRef, System.IO.Stream ByRef) 06d2f5d0 06e61bdf com.imageright.security.remoting.IdentityClientSink.ProcessMessage(System.Runtime.Remoting.Messaging.IMessage, System.Runtime.Remoting.Channels.ITransportHeaders, System.IO.Stream, System.Runtime.Remoting.Channels.ITransportHeaders ByRef, System.IO.Stream ByRef) 06d2f5f0 6778ae69 System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(System.Runtime.Remoting.Messaging.IMessage) 06d2f62c 793c319f System.Runtime.Remoting.Proxies.RemotingProxy.CallProcessMessage(System.Runtime.Remoting.Messaging.IMessageSink, System.Runtime.Remoting.Messaging.IMessage, System.Runtime.Remoting.Contexts.ArrayWithSize, System.Threading.Thread, System.Runtime.Remoting.Contexts.Context, Boolean) 06d2f650 793c2f82 System.Runtime.Remoting.Proxies.RemotingProxy.InternalInvoke(System.Runtime.Remoting.Messaging.IMethodCallMessage, Boolean, Int32) 06d2f6b4 793c2db9 System.Runtime.Remoting.Proxies.RemotingProxy.Invoke(System.Runtime.Remoting.Messaging.IMessage) 06d2f6c4 79374dc3 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(System.Runtime.Remoting.Proxies.MessageData ByRef, Int32) 06d2f960 79f98b43 [TPMethodFrame: 06d2f960] com.imageright.server.IInstrumentation.GetEnterpriseID() 06d2f970 06e618ee imageright.proxies_com.imageright.server.IInstrumentationProxy.GetEnterpriseID() 06d2f9c4 069fddae ImageRight.EMC.EnterpriseNode.EstablishConnection() 06d2fa00 069fdce7 ImageRight.EMC.RootNode.TryOpenConnections(System.Object) 06d2fa38 79407caa System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(System.Object) 06d2fa3c 79373ecd System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 06d2fa54 79407e18 System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(System.Threading._ThreadPoolWaitCallback) 06d2fa68 79407d90 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(System.Object) 06d2fbf8 79e7c74b [GCFrame: 06d2fbf8].
在服务器上抛出异常的是我们的自定义接收器,它负责安全性。我本来可以发布代码如果它在一个地方直接前进。