如何捕获消息大小大于服务(服务器端)接受的异常/故障?

时间:2012-12-14 20:44:14

标签: wcf .net-4.5

首先,我想如果我添加了IDispatchMessageInspector的实现,这可能会在对限制进行任何检查之前拦截消息大小。我很快发现,事实并非如此。运行服务显然确保在较低级别强制执行此规则。现在我很好奇是否有一种方法可以在服务器级别捕获这样的异常并将响应返回给客户端。 IErrorHandler作为ServiceBehavior的实现是否可以解决问题?

也许更一般的问题是:可以在服务器级别跟踪它吗?

值得注意的是,我无法控制WSDL。

2 个答案:

答案 0 :(得分:1)

邮件大小在较低级别验证 - 在传输级别。

没有一种简单的方法来捕获该异常(WCF提供的用于处理异常的IErrorHandling接口在此级别不起作用)。

一种方法是创建自己的自定义wcf传输通道(参见here示例)

请参阅下面,当超出配额时,生成的异常如何显示 - 您可以看到这是从低级别抛出的(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>

答案 1 :(得分:0)

您可以做的最好(以及通常的监控方式)是在消息级别启用日志记录。 http://geekswithblogs.net/mnf/archive/2008/10/03/use-wcf-message-logging.aspx

问题是必须在客户端和服务器上设置maxMessageSize属性。因此,如果邮件太大而无法在客户端发送或接收,则服务器将不会知道此信息。