【问题标题】:NullReferenceException: On WCF ServerNullReferenceException:在 WCF 服务器上
【发布时间】: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 服务的异步调用。但在客户端,我始终确保在创建新代理并再次调用方法之前捕获任何通信异常并安全地清理连接。

标签: .net wcf c#-4.0


【解决方案1】:

您正在从 catch 块中调用通道上的方法。这是不可取的,如果这不是您的问题的原因,我会感到惊讶。

如果 SafeProxy().Channel 返回 null 那么这将导致观察到的行为。不看SafeProxy方法的内容是不可能知道的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多