2012-03-22 3 views
1

Предположим, что:WCF ObjectDisposedException Safe Handle был выпущен клиент/ASP.NET MVC3/Threading

  • ASP.NET MVC3 страницы (с помощью визуального сервера отладки студии) вызывает службы WCF (самодостаточно, чистая. tcp).
  • Служба использует ThreadPool для выполнения некоторой работы, но сразу возвращает значение клиенту.
  • Клиент получает значение и перенаправляет его на другую страницу.
  • Несколько секунд спустя аварии сервер с «ObjectDisposedException/Safe ручка была выпущена)

Сначала я думал, что прокси-сервер будет расположен после страницы переадресации и служба ФОС получить утилизировать тоже, но даже если я не использую ThreadPool (вызывая метод в потоке службы wcf), я тоже получаю исключение. Я не понимаю.

Я не занимаюсь веб-программированием. неправильный?

Клиент
Global.asax (регистрации канала завода)

protected void Application_Start() 
{ 
    builder.Register(c => new ChannelFactory<IWcfBakeryService >("")).SingleInstance(); 

    builder.Register(c => c.Resolve<ChannelFactory<IWcfBakeryService>>() 
     .CreateChannel()) 
     .UseWcfSafeRelease(); 
} 


Repository (канал впрыскивается 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"}; 


Исключение StackTrace (пойманной б у AppDomain 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

+0

Трудно сказать, но реализация DoWork может быть полезна. – jlew

+0

Решил проблему, но не могу опубликовать мой ответ из-за ограничения репутации. Поэтому я отправляю его здесь, пока не смогу (примерно через 8 часов ..) – lurkerbelow

Смежные вопросы