Предположим, что: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()
Я думал, что размещение меньше кода будет лучше, из-за удобочитаемости. Что я должен публиковать? – lurkerbelow
Трудно сказать, но реализация DoWork может быть полезна. – jlew
Решил проблему, но не могу опубликовать мой ответ из-за ограничения репутации. Поэтому я отправляю его здесь, пока не смогу (примерно через 8 часов ..) – lurkerbelow