我有一个 wcf 服务,它使用 DualHttpBindings 的回调。该服务在找到搜索结果时将其数据表推送回客户端(对于长时间运行的搜索)。
这在 .Net 3.5 中运行良好。自从我更新到 .Net 4.0 后,它就抛出了 System.Runtime.FatalException,实际上杀死了 IIS 工作进程。我不知道如何开始解决这个问题。任何建议表示赞赏。
生成的事件日志中的信息粘贴在下面:
发生未处理的异常并且
该进程被终止。
应用程序 ID:/LM/W3SVC/2/ROOT/CP
进程ID:5284
> 例外:
系统运行时致命异常
> 消息:对象引用未设置为
对象的实例。
堆栈跟踪: 在
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&
远程过程调用)在
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&
远程过程调用)在
System.ServiceModel.Dispatcher.MessageRpc.Process(布尔值
isOperationContextSet)位于
System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump(RequestContext
请求,布尔清洁线程,
操作上下文
当前操作上下文)位于
System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest(RequestContext
请求、操作上下文
当前操作上下文)位于
System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump(IAsyncResult
结果)在
System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult
结果)在
System.Runtime.AsyncResult.Complete(布尔值
同步完成)于
系统.运行时.输入队列1.AsyncQueueReader.Set(Item
item) at
System.Runtime.InputQueue
1.调度()
在
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.ReliableChannelBinder1.InputAsyncResult
1.OnInputComplete(IAsyncResult
结果)在
System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult
结果)在
System.Runtime.AsyncResult.Complete(布尔值
同步完成)于
系统.运行时.输入队列1.AsyncQueueReader.Set(Item
item) at
System.Runtime.InputQueue
1.调度()
在
System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback(UInt32
错误代码,UInt32 numBytes,
NativeOverlapped* nativeOverlapped)
在
System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32
错误,UInt32 字节读取,
NativeOverlapped* nativeOverlapped)
在
System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32
错误代码,UInt32 numBytes,
NativeOverlapped* pOVERLAP)
> 内部异常:
> 系统.NullReferenceException
Message:对象引用未设置为
对象的实例。
堆栈跟踪: 在
System.Web.HttpApplication.ThreadContext.Enter(布尔值
setImpersonationContext)位于
System.Web.HttpApplication.OnThreadEnterPrivate(布尔值
setImpersonationContext)位于
System.Web.AspNetSynchronizationContext.CallCallback可能UnderLock(SendOrPostCallback
回调,对象状态)位于
System.Web.AspNetSynchronizationContext.CallCallback(SendOrPostCallback
回调,对象状态)位于System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&
远程过程调用)
好的 - 我找到了答案。很奇怪,但只需将以下属性放在 WCF 回调包装类上:
[CallbackBehavior(UseSynchronizationContext=false)]
感谢 Caaldwell.net 的回答:http://www.cauldwell.net/patrick/blog/CategoryView,类别,CodeGen.aspx http://www.cauldwell.net/patrick/blog/CategoryView,category,CodeGen.aspx
来自 cauldwell.net:
事实证明,问题在于
ASP.NET 使用(默认)一点
东西叫做
同步上下文。和我一样近
可以告诉(我没有研究过这个
彻底地,说实话)其中之一
工作以确保任何
回调在 UI 线程上运行,
从而无需调用
Control.Invoke 就像你在
WinForms。就我而言,额外的
锁给了一些适合的东西,而且它
正在尝试清理a上的东西
不再存在的线程,
因此出现 NullReferenceException。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)