【发布时间】:2015-02-27 06:57:02
【问题描述】:
WCF 服务器托管在 Windows 服务上。我们偶尔会收到以下错误。我确信这不是应用程序错误,而是在关闭连接时在 WCF 框架中引发的。任何人以前都看过这个并且有幸修复它,请分享。非常感谢任何帮助。
System.NullReferenceException: Object reference not set to an instance of an object.
Server stack trace:
at System.Threading.Overlapped.Free(NativeOverlapped* nativeOverlappedPtr)
at System.ServiceModel.Channels.OverlappedContext.Free()
at System.ServiceModel.Channels.OverlappedContext.FreeOrDefer()
at System.ServiceModel.Channels.SocketConnection.Abort(TraceEventType traceEventType, String timeoutErrorString, TransferOperation transferOperation)
at System.ServiceModel.Channels.SocketConnection.Abort()
at System.ServiceModel.Channels.DelegatingConnection.Abort()
at System.ServiceModel.Channels.ConnectionPool.AbortItem(IConnection item)
at System.ServiceModel.Channels.IdlingCommunicationPool\`2.IdleTimeoutEndpointConnectionPool.AbortItem(TItem item)
at System.ServiceModel.Channels.CommunicationPool\`2.EndpointConnectionPool.ReturnConnection(TItem connection, Boolean connectionIsStillGood, TimeSpan timeout)
at System.ServiceModel.Channels.ConnectionPoolHelper.EstablishConnection(TimeSpan timeout)
at System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
以下是客户端的摘录。
public DateTime GetLastReferenceDataRefreshedTime()
{
RfaReferenceServiceProxy serviceProxy = null;
try
{
serviceProxy = SafeProxy();
return serviceProxy.Channel.GetLastReferenceDataRefreshedTime();
}
catch (CommunicationException exception)
{
Log.Error("Retrying after communication exception:" + exception.Message);
return SafeProxy().Channel.GetLastReferenceDataRefreshedTime();
}
}
【问题讨论】:
-
尝试查看内部异常以获取有关引发异常的位置的信息
-
你在异步运行吗?其他东西可能取决于单独线程上的连接,这就是为什么你会得到不可预测的行为。可能存在竞争条件,如果您在其他线程执行其例程之前关闭连接,则会发生这种情况。查看您的代码并确保您正在检查
null。无论哪种方式,没有代码我们无法分辨。 -
能否在关闭连接时将代码贴在服务上?
-
@TomRedfern,是否可以显式关闭服务上的连接。我相信Timouts会自动处理它。 Release Connection in server.
-
@B.K.确实有来自客户端对 WCF 服务的异步调用。但在客户端,我始终确保在创建新代理并再次调用方法之前捕获任何通信异常并安全地清理连接。