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 バインディングを使用しています。

まず第一に、John Saundars がこのリンクで述べたように、上記のシナリオを実装することはまったく可能ですか?

「OperationContext.Current.GetCallbackChannel」は実際に何をしますか?

助けてくれてありがとう。

4

2 に答える 2

0

「フリーズ」とはどういう意味かわかりませんが、更新されないか、応答しなくなるだけです。

応答が wcf サービスから Web サーバーに返される前に、asp ページの応答がブラウザーに送信される可能性があります。この場合、結果がサービスから戻ってきても、asp ページは更新されません。

次の 2 つのオプションがあります。

  • JavaScript を使用してサーバーに変更をポーリングします。
  • サービスからの応答を受信するまで、アップロード ページの戻りをブロックします。

コールバックを待つことになった場合は、リクエスト レスポンス スタイルを実行する方が簡単です。

もう 1 つの一般的な問題は、コールバックを受信する前にクライアントの wcf プロキシが閉じられることです。トレースはそれが戻ってくることを示しますが、誰も聞いていません。

于 2010-09-30T11:54:09.083 に答える
0

コンピューターを再起動したところ、クライアント (ASP.NET) 側の Trace ビューアーに次のように表示され、ページがフリーズ (応答なし) しなくなりました。私が最も懸念するメッセージは、その内部例外です: System.NullReferenceException、mscorlib で、Object reference not... と表示されます。

コンソール アプリケーションを WCF サービスのクライアントとして使用してみました。コールバックはうまく機能します。IIS で Web サイトをホストし、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 リクエスト、Boolean cleanThread、OperationContext currentOperationContext) System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest(RequestContext リクエスト、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.ServiceModel.Channels.ReliableDuplexSessionChannel.OnReceiveCompletedStatic(IAsyncResult 結果) で System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult 結果) で System.Runtime.AsyncResult で。 System.ServiceModel.Channels.ReliableChannelBinder で完了 (Boolean completedSynchronously)1.InputAsyncResult1.OnInputComplete(IAsyncResult 結果) で System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult 結果) で System.ServiceModel.Diagnostics.TraceUtility.<>c_ DisplayClass4.<CallbackGenerator>b _2(AsyncCallback コールバック、IAsyncResult 結果) で System. System.Runtime.InputQueue での Runtime.AsyncResult.Complete (Boolean completedSynchronously)1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue1.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.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.ServiceModel.Channels.ReliableDuplexSessionChannel.OnReceiveCompletedStatic(IAsyncResult 結果) で System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult 結果) で System.Runtime.AsyncResult で。 System.ServiceModel.Channels.ReliableChannelBinder で完了 (Boolean completedSynchronously)1.InputAsyncResult1.OnInputComplete(IAsyncResult 結果) で System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult 結果) で System.ServiceModel.Diagnostics.TraceUtility.<>c_ DisplayClass4.<CallbackGenerator>b _2(AsyncCallback コールバック、IAsyncResult 結果) で System.
System.Runtime.InputQueue でのRuntime.AsyncResult.Complete (Boolean completedSynchronously)1.AsyncQueueReader.Set(Item item) at System.Runtime.InputQueue1.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.NullReferenceException、mscorlib、バージョン = 4.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089 オブジェクト参照がオブジェクトのインスタンスに設定されていません。System.Web.HttpApplication.ThreadContext.Enter (ブール setImpersonationContext) で System.Web で。HttpApplication.OnThreadEnterPrivate(Boolean setImpersonationContext) System.Web.AspNetSynchronizationContext.CallCallbackPossivelyUnderLock(SendOrPostCallback コールバック、オブジェクト状態) で System.Web.AspNetSynchronizationContext.CallCallback(SendOrPostCallback コールバック、オブジェクト状態) で System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc ) System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。System.Web.HttpApplication.ThreadContext.Enter (ブール値 setImpersonationContext) で System.Web.HttpApplication.OnThreadEnterPrivate (ブール値 setImpersonationContext) で System.Web.AspNetSynchronizationContext.CallCallbackPossivelyUnderLock (SendOrPostCallback コールバック、オブジェクト状態) で System.Web.AspNetSynchronizationContext で。

于 2010-09-30T14:06:40.003 に答える