0

我有一个托管在 IIS 中的不同盒子中的 Web 服务和托管在 Windows 服务中的 WCF 服务,在不同的盒子中。(N 层方法)。这里,Web 服务是 WCF 服务的客户端。上传文件的请求来自 IIS 托管的 Web 服务,该 IIS 托管的 Web 服务作为回报调用 WCF 服务并进行实际上传。到现在为止还挺好。上传完成后,WCF 服务执行回调(我已将回调存储在字典中,并且我使用过 (InstanceContextMode=InstanceContextMode.PerSession, ConcurrencyMode=ConcurrencyMode.Multiple))。WCF 服务发送回调。在跟踪查看器中,看起来 ASP.NET 收到了回调,但浏览器中的上传页面(这是最终用户)永远冻结了。我正在使用 larsw 的 ChunkingChannel 绑定。

首先,正如约翰桑德斯在此链接中提到的那样,是否有可能实现上述情景:

“OperationContext.Current.GetCallbackChannel”实际上是做什么的?

谢谢您的帮助。

4

2 回答 2

0

不知道您所说的“冻结”是什么意思,这仅仅是它没有更新还是它变得无响应。

可能是 asp 页面的响应在响应从 wcf 服务返回到 Web 服务器之前发送到浏览器。在这种情况下,当结果从服务返回时,asp 页面不会得到更新。

您有 2 个选项:

  • 使用 javascript 轮询服务器以进行更改。
  • 阻止上传页面的返回,直到收到来自服务的响应。

如果您最终等待回调,那么只做一个请求响应样式会更简单。

另一个常见问题是客户端上的 wcf 代理在收到回调之前关闭。跟踪会显示它回来了,但没有人在听。

于 2010-09-30T11:54:09.083 回答
0

很奇怪,我重新启动了计算机,现在在客户端(ASP.NET)端的跟踪查看器中得到以下内容,而且页面现在也没有冻结(无响应)。我最关心的消息是它的内部异常:System.NullReferenceException,mscorlib 并说 Object reference not...

我尝试使用控制台应用程序作为 WCF 服务的客户端。回调效果很好。只有当我在 IIS 中托管我的网站并调用 WCF 服务来上传文件时(作为回报,它会回调客户端以通知上传成功/不成功)。

(我正在使用 HttpChunkingBinding)。任何的想法?

System.Runtime.FatalException, System.Runtime.DurableInstancing, Version=4.0.0.0, Culture=neutral, 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 request, Boolean cleanThread, OperationContext currentOperationContext) 在 System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest(RequestContext request, OperationContext currentOperationContext) 在 System.ServiceModel.Dispatcher.ChannelHandler。DisplayClass4.<CallbackGenerator>b _2(AsyncCallback 回调,IAsyncResult 结果) 在 System.Runtime.AsyncResult.Complete(Boolean completedSynchronously) 在 System.Runtime.InputQueue 1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue1.Dispatch() 在 System.ServiceModel.Channels.ReliableDuplexSessionChannel.ProcessDuplexMessage(WsrmMessageInfo 信息) 在 System.ServiceModel.Channels.ReliableDuplexSessionChannel.HandleReceiveComplete(IAsyncResult 结果) 在 System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult 结果) 在 System.Runtime.AsyncResult 的 System.ServiceModel.Channels.ReliableDuplexSessionChannel.OnReceiveCompletedStatic(IAsyncResult 结果)。在 System.ServiceModel.Channels.ReliableChannelBinder 完成(布尔完成同步)1.InputAsyncResult1.OnInputComplete(IAsyncResult result) at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result) at System.ServiceModel.Diagnostics.TraceUtility.<>c_ DisplayClass4.<CallbackGenerator>b _2(AsyncCallback callback, IAsyncResult result) at System。 Runtime.AsyncResult.Complete(Boolean completedSynchronously) 在 System.Runtime.InputQueue1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue1.Dispatch() at System.Runtime.ActionItem.DefaultActionItem.Invoke() at System.Runtime.ActionItem.CallbackHelper.InvokeWithoutContext(Object state) at 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.DisplayClass4.<CallbackGenerator>b _2(AsyncCallback 回调,IAsyncResult 结果) 在 System.Runtime.AsyncResult.Complete(Boolean completedSynchronously)
在 System.Runtime.InputQueue 1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue1.Dispatch() 在 System.ServiceModel.Channels.ReliableDuplexSessionChannel.ProcessDuplexMessage(WsrmMessageInfo 信息) 在 System.ServiceModel.Channels.ReliableDuplexSessionChannel.HandleReceiveComplete(IAsyncResult 结果) 在 System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult 结果) 在 System.Runtime.AsyncResult 的 System.ServiceModel.Channels.ReliableDuplexSessionChannel.OnReceiveCompletedStatic(IAsyncResult 结果)。在 System.ServiceModel.Channels.ReliableChannelBinder 完成(布尔完成同步)1.InputAsyncResult1.OnInputComplete(IAsyncResult result) at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result) at System.ServiceModel.Diagnostics.TraceUtility.<>c_ DisplayClass4.<CallbackGenerator>b _2(AsyncCallback callback, IAsyncResult result) at System。 Runtime.AsyncResult.Complete(Boolean completedSynchronously)
在 System.Runtime.InputQueue1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue1.Dispatch() at System.Runtime.ActionItem.DefaultActionItem.Invoke() at System.Runtime.ActionItem.CallbackHelper.InvokeWithoutContext(Object state) at 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.NullReferenceException,mscorlib,版本= 4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089 对象引用未设置为对象的实例。在 System.Web 的 System.Web.HttpApplication.ThreadContext.Enter(Boolean setImpersonationContext)。HttpApplication.OnThreadEnterPrivate(Boolean setImpersonationContext) 在 System.Web.AspNetSynchronizationContext.CallCallbackPossiblyUnderLock(SendOrPostCallback 回调,对象状态) 在 System.Web.AspNetSynchronizationContext.CallCallback(SendOrPostCallback 回调,对象状态) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc ) System.NullReferenceException:对象引用未设置为对象的实例。在 System.Web.HttpApplication.ThreadContext.Enter(Boolean setImpersonationContext) 在 System.Web.HttpApplication.OnThreadEnterPrivate(Boolean setImpersonationContext) 在 System.Web.AspNetSynchronizationContext.CallCallbackPossiblyUnderLock(SendOrPostCallback 回调,对象状态) 在 System.Web.AspNetSynchronizationContext。

于 2010-09-30T14:06:40.003 回答