更新到.net 4.0后的wcf回调异常

时间:2010-06-02 16:39:24

标签: .net wcf iis exception

我有一个使用DualHttpBindings回调的wcf服务。该服务在找到它们时将客户端(用于长时间运行的搜索)的搜索结果数据推回。

这在.Net 3.5中运行良好。自从我更新到.Net 4.0以来,它实际上杀死了一个实际上杀死了IIS工作进程的System.Runtime.FatalException。我不知道如何开始解决这个问题。任何建议表示赞赏

结果事件日志中的信息粘贴在下面:


  

发生了未处理的异常   这个过程终止了。

     

申请ID:/ LM / W3SVC / 2 / ROOT / CP

     

进程ID:5284

     

>例外:   System.Runtime.FatalException

     

>消息:未设置对象引用   对象的实例。

     

StackTrace :at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&安培;   rpc)at   System.ServiceModel.Dispatcher.MessageRpc.Process(布尔   isOperationContextSet)at   System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump(的RequestContext   request,Boolean cleanThread,   的OperationContext   currentOperationContext)at   System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest(的RequestContext   请求,OperationContext   currentOperationContext)at   System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump(IAsyncResult的   结果)在   System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult的   结果)在   System.Runtime.AsyncResult.Complete(布尔   完成同步)   System.Runtime.InputQueue 1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue 1.Dispatch()   在   System.ServiceModel.Channels.ReliableDuplexSessionChannel.ProcessDuplexMessage(WsrmMessageInfo   信息)   System.ServiceModel.Channels.ReliableDuplexSessionChannel.HandleReceiveComplete(IAsyncResult的   结果)在   System.ServiceModel.Channels.ReliableDuplexSessionChannel.OnReceiveCompletedStatic(IAsyncResult的   结果)在   System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult的   结果)在   System.Runtime.AsyncResult.Complete(布尔   完成同步)   System.ServiceModel.Channels.ReliableChannelBinder 1.InputAsyncResult 1.OnInputComplete(IAsyncResult的   结果)在   System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult的   结果)在   System.Runtime.AsyncResult.Complete(布尔   完成同步)   System.Runtime.InputQueue 1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue 1.Dispatch()   在   System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback(UInt32的   errorCode,UInt32 numBytes,   NativeOverlapped * nativeOverlapped)
  在   System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32的   错误,UInt32 bytesRead,   NativeOverlapped * nativeOverlapped)
  在   System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32的   errorCode,UInt32 numBytes,   NativeOverlapped * pOVERLAP)

     

>的InnerException:   的> System.NullReferenceException

     

消息:未将对象引用设置为   一个对象的实例。

     

StackTrace :at   System.Web.HttpApplication.ThreadContext.Enter(布尔   setImpersonationContext)at   System.Web.HttpApplication.OnThreadEnterPrivate(布尔   setImpersonationContext)at   System.Web.AspNetSynchronizationContext.CallCallbackPossiblyUnderLock(SendOrPostCallback   回调,对象状态)at   System.Web.AspNetSynchronizationContext.CallCallback(SendOrPostCallback   回调,对象状态)at   的 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&安培;   RPC)

1 个答案:

答案 0 :(得分:15)

好的 - 我找到了答案。非常奇怪,但只是将以下属性放在WCF回调包装类上:

[CallbackBehavior(UseSynchronizationContext=false)]

感谢Cauldwell.net的回答:http://www.cauldwell.net/patrick/blog/CategoryView,category,CodeGen.aspx

来自cauldwell.net:

  

事实证明,这个问题就是这样   ASP.NET使用(默认情况下)一点   事情叫做   的SynchronizationContext。就像我一样   可以告诉(我还没有研究过这个   彻底,说实话)其中一个   工作,以确保任何   回调在UI线程上运行,   从而避免了打电话的需要   Control.Invoke就像你一样   的WinForms。在我的情况下,额外的   锁给了适合的东西,它   我试图清理一些东西   不再有的线程,   因此为NullReferenceException。