.net - 在服务器上引发远程异常时,获取套接字关闭错误

标签 .net exception sockets remoting

我有一个使用.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 *)

最佳答案

是.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, bool 值)
06d2f650 793c2f82 System.Runtime.Remoting.Proxies.RemotingProxy.InternalInvoke(System.Runtime.Remoting.Messaging.IMethodCallMessage, bool 值,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。EstablishmentConnection()
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, bool 值)
06d2f650 793c2f82 System.Runtime.Remoting.Proxies.RemotingProxy.InternalInvoke(System.Runtime.Remoting.Messaging.IMethodCallMessage, bool 值,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。EstablishmentConnection()
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]。

在服务器上引发异常的是我们的自定义接收器,该接收器负责安全性。我本来可以将代码发布在一个地方,并且很简单。

关于.net - 在服务器上引发远程异常时,获取套接字关闭错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/118192/

相关文章:

java - java中未使用的异常并从映射中删除对象

c++ - 你如何断言一个对象在 C++ 中有一个特定的方法?

.net - Lambda多线作为线程参数?

.net - LINQ to Entities 无法识别该方法

java - 解析wsdl时出现异常

actionscript-3 - 未处理的套接字安全错误,即使(貌似)对其进行处理

.net - 使用TCP或UDP套接字的VB 2008在线聊天应用程序

networking - 为什么微软以不同的方式实现套接字?

c# - 中止阻塞线程的正确方法

c# - OleDbParameter 的名称痴迷