假設:WCF的ObjectDisposedException安全句柄已發佈/ ASP.NET MVC3客戶端/線程
- 一個ASP.NET MVC3頁(使用Visual Studio的調試服務器)調用WCF服務(託管自我,淨。 tcp綁定)。
- 服務使用ThreadPool做一些工作,但立即返回一個值給客戶端
- 客戶端獲取該值並重定向到另一個頁面。
- 幾秒鐘後用「的ObjectDisposedException /安全處理服務器崩潰已被釋放)
首先,我認爲網頁重定向和WCF服務將得到安置太后代理將被安置,但即使我沒有使用ThreadPool(通過調用wcf服務線程內的方法),我也得到了異常。我不明白。
我不是真的進入web編程。錯?
客戶端
Global.asax中(註冊信道工廠)
protected void Application_Start()
{
builder.Register(c => new ChannelFactory<IWcfBakeryService >("")).SingleInstance();
builder.Register(c => c.Resolve<ChannelFactory<IWcfBakeryService>>()
.CreateChannel())
.UseWcfSafeRelease();
}
庫(信道由Autofac注入)
public BakeryRepository(IWcfBakeryService orderService)
{
}
public ReciepeResponse RequestReciepe(CakeDto webOrder)
{
[...]
return service.RequestReciepe(request);
}
服務器:
合同
[ProtoBehavior, OperationContract(IsTerminating=false)]
ReciepeResponse RequestReciepe(ReciepeRequest request);
服務的實現
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
RequestReciepe /服務方法
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork));
return new ReciepeResponse() { SomeValue = "Some Value"};
異常堆棧跟蹤(由鴨釣到pDomain UnhandledException)
bei System.Runtime.InteropServices.SafeHandle.DangerousAddRef(Boolean& success)
bei System.StubHelpers.StubHelpers.SafeHandleAddRef(SafeHandle pHandle, Boolean& success)
bei Microsoft.Win32.Win32Native.SetEvent(SafeWaitHandle handle)
bei System.Threading.EventWaitHandle.Set()
bei System.Runtime.Remoting.Messaging.AsyncResult.SyncProcessMessage(IMessage msg)
bei System.Runtime.Remoting.Messaging.StackBuilderSink.AsyncProcessMessage(IMessage msg, IMessageSink replySink)
bei System.Runtime.Remoting.Proxies.AgileAsyncWorkerItem.DoAsyncCall()
bei System.Runtime.Remoting.Proxies.AgileAsyncWorkerItem.ThreadPoolCallBack(Object o)
bei System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
bei System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
bei System.Threading.ThreadPoolWorkQueue.Dispatch()
bei System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
我認爲發佈較少的代碼會更好,因爲可讀性。我應該發佈什麼? – lurkerbelow 2012-03-22 12:04:04
很難說,但DoWork的實施可能會有幫助。 – jlew 2012-03-22 12:44:33
解決了這個問題,但因信譽限制無法發佈我的答案。所以我在這裏發佈,直到我可以(大約8小時..) – lurkerbelow 2012-03-22 12:46:38