我正在运行一个 Windows 服务,该服务正在对其他地方运行的多个其他 WCF 服务进行多次调用。有时,我们的客户在调用端点时会遇到无法捕获的异常,从而导致我们的服务瘫痪。端点的服务器端正在运行一个实例,除了它进行的数据库调用之外,该实例是完全无状态的。
例外是“System.AccessViolationException”,我知道它属于损坏状态异常的类别,正如我在此处阅读的那样。
我知道 [HandleProcessCorruptedStateExceptions] 属性,以及所有反对使用它来处理不由异常捕获器维护的代码的警告。
调用堆栈的顶部深入研究了 WCF 包装的本机 Windows 库:
System.AccessViolationException Stack:
at System.Net.UnsafeNclNativeMethods+OSSOCK.recv(IntPtr, Byte*, Int32, System.Net.Sockets.SocketFlags)
at System.Net.Sockets.Socket.Receive(Byte[], Int32, Int32, System.Net.Sockets.SocketFlags, System.Net.Sockets.SocketError ByRef)
at System.Net.Sockets.Socket.Receive(Byte[], Int32, Int32, System.Net.Sockets.SocketFlags)
at System.Net.Sockets.NetworkStream.Read(Byte[], Int32, Int32)
at System.Net.PooledStream.Read(Byte[], Int32, Int32)
at System.Net.Connection.SyncRead(System.Net.HttpWebRequest, Boolean, Boolean)
at System.Net.Connection.PollAndRead(System.Net.HttpWebRequest, Boolean)
at System.Net.ConnectStream.WriteHeaders(Boolean)
at System.Net.HttpWebRequest.EndSubmitRequest()
at System.Net.HttpWebRequest.SetRequestSubmitDone(System.Net.ConnectStream)
at System.Net.Connection.CompleteStartRequest(Boolean, System.Net.HttpWebRequest, System.Net.TriState)
at System.Net.Connection.SubmitRequest(System.Net.HttpWebRequest, Boolean)
at System.Net.ServicePoint.SubmitRequest(System.Net.HttpWebRequest, System.String)
at System.Net.HttpWebRequest.SubmitRequest(System.Net.ServicePoint)
at System.Net.HttpWebRequest.GetRequestStream(System.Net.TransportContext ByRef)
at System.Net.HttpWebRequest.GetRequestStream()
at System.ServiceModel.Channels.HttpOutput+WebRequestHttpOutput.GetOutputStream()
at System.ServiceModel.Channels.HttpOutput.Send(System.TimeSpan)
at System.ServiceModel.Channels.HttpChannelFactory`1+HttpRequestChannel+HttpChannelRequest[[System.__Canon, mscorlib, …
Run Code Online (Sandbox Code Playgroud)