2012-03-22 51 views
1

假設: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() 

回答

1

已解決。

我的Wcf服務使用現有的業務邏輯。另一位開發人員使用定製的並行類的實現對多線程的目的,這是呼喚:

iAsyncResult.AsyncWaitHandle.Close(); 

誰使用並行類中的方法不被設計線程安全的。這樣做後,一切似乎工作正常。

2

很難肯定地說在有限的代碼,但我猜的工作線程其實之前得到它的東西在你的回調的背景下已被釋放。

+0

我認爲發佈較少的代碼會更好,因爲可讀性。我應該發佈什麼? – lurkerbelow 2012-03-22 12:04:04

+0

很難說,但DoWork的實施可能會有幫助。 – jlew 2012-03-22 12:44:33

+0

解決了這個問題,但因信譽限制無法發佈我的答案。所以我在這裏發佈,直到我可以(大約8小時..) – lurkerbelow 2012-03-22 12:46:38