2

最初は、IDispatchMessageInspectorの実装を追加すると、制限のチェックが行われる前にメッセージサイズが傍受される可能性があると思いました。私はすぐに見つけました、これはそうではありません。実行中のサービスは、明らかにこのルールをより低いレベルで適用するようにします。サーバーレベルでそのような例外をキャプチャし、クライアントに応答を返す方法があるかどうか知りたいです。ServiceBehaviorとしてのIErrorHandlerの実装でうまくいくでしょうか?

おそらく、より一般的な質問は次のとおりです。これはサーバーレベルで追跡できますか?

また、私がWSDLを制御していないことにも注意してください。

4

2 に答える 2

1

メッセージサイズは、下位レベル(トランスポートレベル)で検証されます。

その例外をキャッチする簡単な方法はありません(例外を処理するためにWCFによって提供されるIErrorHandlingインターフェイスはこのレベルでは機能しません)。

1つの方法は、独自のカスタムwcfトランスポートチャネルを作成することです(ここで例を参照)

クォータを超えたときに生成された例外がどのように表示されるかを以下で確認してください。これは低レベル(HttpChannelListener)からスローされていることがわかります。

<ExceptionType>System.ServiceModel.ProtocolException, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
<Message>The maximum message size quota for incoming messages (225) has been exceeded. To increase the quota, use the MaxReceivedMessageSize property on the appropriate binding element.</Message>
<StackTrace>
at System.ServiceModel.Channels.HttpInput.ThrowHttpProtocolException(String message, HttpStatusCode statusCode, String statusDescription)
at System.ServiceModel.Channels.HttpInput.ThrowMaxReceivedMessageSizeExceeded()
at System.ServiceModel.Channels.HttpInput.GetMessageBuffer()
at System.ServiceModel.Channels.HttpInput.ParseMessageAsyncResult.DecodeBufferedMessageAsync()
at System.ServiceModel.Channels.HttpInput.ParseMessageAsyncResult.BeginParse()
at System.ServiceModel.Channels.HttpInput.BeginParseIncomingMessage(HttpRequestMessage httpRequestMessage, AsyncCallback callback, Object state)
at System.ServiceModel.Channels.HttpPipeline.EmptyHttpPipeline.BeginParseIncomingMessage(AsyncCallback asynCallback, Object state)
at System.ServiceModel.Channels.HttpPipeline.EnqueueMessageAsyncResult..ctor(ReplyChannelAcceptor acceptor, Action dequeuedCallback, HttpPipeline pipeline, AsyncCallback callback, Object state)
at System.ServiceModel.Channels.HttpPipeline.EmptyHttpPipeline.BeginProcessInboundRequest(ReplyChannelAcceptor replyChannelAcceptor, Action dequeuedCallback, AsyncCallback callback, Object state)
at System.ServiceModel.Channels.HttpChannelListener`1.HttpContextReceivedAsyncResult`1.ProcessHttpContextAsync()
at System.ServiceModel.Channels.HttpChannelListener`1.BeginHttpContextReceived(HttpRequestContext context, Action acceptorCallback, AsyncCallback callback, Object state)
at System.ServiceModel.Activation.HostedHttpTransportManager.HttpContextReceived(HostedHttpRequestAsyncResult result)
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.HandleRequest()
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.BeginRequest()
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.OnBeginRequest(Object state)
at System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
at System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
</StackTrace>
于 2012-12-16T11:10:46.173 に答える
0

あなたができる最善のこと(そしてこれを監視する通常の方法)は、メッセージレベルでロギングを有効にすることです。 http://geekswithblogs.net/mnf/archive/2008/10/03/use-wcf-message-logging.aspx

問題は、maxMessageSizeプロパティをクライアントとサーバーの両方で設定する必要があることです。したがって、メッセージが大きすぎてクライアント側で送受信できない場合、サーバーはこれを認識しません。

于 2012-12-15T10:31:21.113 に答える