Возможен ли обратный вызов из WCF в ASP.NET? - PullRequest
0 голосов
/ 29 сентября 2010

У меня есть веб-служба, размещенная в IIS в другом ящике, а служба WCF, размещенная в службе Windows, в другом ящике (N-уровневый подход). Здесь Web-сервис является клиентом для WCF-сервиса. Запрос на загрузку файла поступает в размещенную веб-службу IIS, и эта размещенная веб-служба IIS, в свою очередь, вызывает службу WCF и выполняет фактическую загрузку. Все идет нормально. После завершения загрузки служба WCF выполняет обратный вызов (я сохранил обратные вызовы в словаре и использовал их (InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)) Служба WCF отправляет обратный вызов. В средстве просмотра трассировки похоже, что ASP.NET получил обратный вызов, но страница загрузки в браузере (это конечный пользователь) навсегда зависает. Я использую привязку ChunkingChannel от larsw.

Прежде всего, возможно ли вообще реализовать вышеуказанный senario, как упоминал Джон Саундарс по этой ссылке:

Что на самом деле делает «OperationContext.Current.GetCallbackChannel»?

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2010

Он устарел, я перезагрузил компьютер и теперь получаю следующее в средстве просмотра трассировки на стороне клиента (ASP.NET), а также страница не зависает (не отвечает). Сообщение, которое больше всего касается меня, является его внутренним исключением: System.NullReferenceException, mscorlib и говорит, что ссылка на объект не ...

Я пытался использовать консольное приложение в качестве клиента для службы WCF. Обратный звонок прекрасно работает. Только когда я размещаю свой веб-сайт в IIS и вызываю службу WCF для загрузки файла (который в свою очередь перезванивает клиенту, чтобы сообщить, что загрузка была / не удалась).

(я использую HttpChunkingBinding). Есть идеи?

System.Runtime.FatalException, System.Runtime.DurableInstancing, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35 Объект ссылка не установлена ​​на экземпляр объекта. в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc & rpc) в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31 (MessageRpc & rpc) в System.ServiceModel.Dispatcher.MessageRpc.Process (Boolean isOperationContextSet) в System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump (RequestContext запрос, логическое значение cleanThread, OperationContext currentOperationContext) в System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest (RequestContext запрос, OperationContext currentOperationContext) в System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump (IAsyncResult результат) в System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame (IAsyncResult результат) в System.ServiceModel.Diagnostics.TraceUtility. <> C_ DisplayClass4. B _2 (AsyncCallback обратный вызов, результат IAsyncResult) в System.Runtime.AsyncResult.Complete (логическое завершение синхронно) в System.Runtime.InputQueue 1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue 1.Dispatch () в 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 (Boolean завершено синхронно) в System.ServiceModel.Channels.ReliableChannelBinder 1.InputAsyncResult 1.OnInputComplete (IAsyncResult результат) в System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame (IAsyncResult результат) в System.ServiceModel.Diagnostics.TraceUtility. <> C_ DisplayClass4. б _2 (AsyncCallback обратный вызов, результат IAsyncResult) в System.Runtime.AsyncResult.Complete (логическое завершение синхронно) в System.Runtime.InputQueue 1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue 1.Dispatch () в System.Runtime.ActionItem.DefaultActionItem.Invoke () в System.Runtime.ActionItem.CallbackHelper.InvokeWithoutContext (Объект состояние) в System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback (UInt32 errorCode, UInt32 numBytes, NativeOverlapped * nativeOverlapped) в System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame (UInt32 ошибка, UInt32 bytesRead, NativeOverlapped * nativeOverlapped) в System.Threading._IOCompletionCallback.PerformIOCompletionCallback (UInt32 errorCode, UInt32 numBytes, NativeOverlapped * pOVERLAP) System.Runtime.FatalException: ссылка на объект отсутствует установить экземпляр объекта. ---> System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта. в System.Web.HttpApplication.ThreadContext.Enter (Boolean setImpersonationContext) в System.Web.HttpApplication.OnThreadEnterPrivate (Boolean setImpersonationContext) в System.Web.AspNetSynchronizationContext.CallCallbackPossiblyUnderLock (SendOrPostCallback обратный вызов, состояние объекта) в System.Web.AspNetSynchronizationContext.CallCallback (SendOrPostCallback обратный вызов, состояние объекта) вSystem.ServiceModel.Dispatcher.MessageRpc & rpc) в System.ServiceModel.Dispatcher.MessageRpc.Process (Boolean isOperationContextSet) в System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump (запрос RequestContext, логический cleanThest, requestConquireReaderHackSecler.Dervice.Tec)., OperationContext currentOperationContext) в System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump (результат IAsyncResult) в System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame (результат IAsyncResult) в System.ServiceModel.1018 * b _2 (обратный вызов AsyncCallback, результат IAsyncResult) в System.Runtime.AsyncResult.Complete (Boolean completeSynchronously)
в System.Runtime.InputQueue 1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue 1.Dispatch () в System.ServiceModel.Channels.ReliableDuplexSessionChannel.ProcessDuplexMessage (WsrmMessagelepleChangeChannelShannelShanChannelShanShanShanShanerShanShanerShanShanShanShanerShanerSanShanShanShaner).)).(Результат IAsyncResult) в System.ServiceModel.Channels.ReliableDuplexSessionChannel.OnReceiveCompletedStatic (результат IAsyncResult) в System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame (результат IAsyncResult.ChynSyncle.SecLE.CLENLE..ReliableChannelBinder 1.InputAsyncResult 1.OnInputComplete (результат IAsyncResult) в System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame (результат IAsyncResult) в System.ServiceModel.Diagnostics.TraceUtility. <> C_ * 242 * 1024. * Класс отображения_2 (обратный вызов AsyncCallback, результат IAsyncResult) в System.Runtime.AsyncResult.Complete (Boolean завершено синхронно)
в System.Runtime.InputQueue 1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue 1.Dispatch () в System.Runtime.ActionItem.DefaultActionItem.Invoke () в System.Runtime.ActionItem.CallbackHelper.InvokeWithoutContext (состояние объекта) в System.Runtime.IOThreadScheduler.ScheduledOverlapped.в System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame (ошибка UInt32, bytesRead UInt32, NativeOverlapped * nativeOverlapped) в System.Threading._IOCompletionCallback.PerformIOCompletionCallback (код ошибки UInt32, переменная типа ULB)0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089 Ссылка на объект не установлена ​​на экземпляр объекта.в System.Web.HttpApplication.ThreadContext.Enter (логическое значение setImpersonationContext) в System.Web.HttpApplication.OnThreadEnterPrivate (логическое значение setImpersonationContext) в System.Web.AspNetSynchronizationContext.CallBackSignTackSignTackState.Conject.Conject.Conject.Conject.Conject.Wall.Control.Wall.Wall.Windows.Web.World.Windows.World.Windows.Web.Control.Wall.Web.World.World.World.World.Windows.Chind.Ont.Обратный вызов SendOrPostCallback, состояние объекта) в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc & rpc) System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.в System.Web.HttpApplication.ThreadContext.Enter (логическое значение setImpersonationContext) в System.Web.HttpApplication.OnThreadEnterPrivate (логическое значение setImpersonationContext) в System.Web.AspNetSynchronizationContext.CallBackSignTackSignTackState.Conject.Conject.Conject.Conject.Conject.Wall.Control.Wall.Wall.Windows.Web.World.Windows.World.Windows.Web.Control.Wall.Web.World.World.World.World.Windows.Chind.Ont.Обратный вызов SendOrPostCallback, состояние объекта) в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc & rpc)

0 голосов
/ 30 сентября 2010

Не уверен, что вы подразумеваете под "зависаниями", это просто то, что он не обновляется или перестает отвечать.

Возможно, ответ на страницу asp отправляется в браузер до того, как ответ возвращается на веб-сервер из службы wcf. В этом случае страница asp не будет обновляться при возврате результата из службы.

У вас есть 2 варианта:

  • Используйте javascript для опроса сервера на предмет изменений.
  • Блокируйте возврат страницы загрузки, пока не получен ответ от службы.

Если вы в конечном итоге ожидаете обратного звонка, проще будет сделать стиль ответа на запрос.

Другая распространенная проблема - прокси wcf на клиенте закрывается до получения обратного вызова. След покажет, что он возвращается, но никто не слушает.

...