抛出FaultException时,WCF错误“缓冲XML内容所需的大小超过了缓冲区配额”

时间:2014-01-21 13:46:17

标签: c# wcf

我正在尝试在WCF应用程序的服务器端抛出FaultException。我正在使用DTO作为此异常的有效负载。从某些时刻开始(对于大型对象),我开始在客户端收到“缓冲XML内容所需的大小超过缓冲区配额”异常。所有绑定消息大小参数和maxDepth设置为大的enouth值以摆脱怀疑。 有人遇到过这个问题吗?似乎在互联网上还没有解决方案。 设置

<dataContractSerializer maxItemsInObjectGraph="2147483647" ignoreExtensionDataObject="true" />

没有帮助。

3 个答案:

答案 0 :(得分:15)

问题出在ClientRuntime中的“MaxFaultSize”参数中,默认值为65535,因此默认情况下无法在WCF的故障中传递大的有效负载。要更改此值,您应该编写自定义EndpointBehavior,如下所示:

public class MaxFaultSizeBehavior : IEndpointBehavior
{
    private readonly int _size;

    public MaxFaultSizeBehavior(int size)
    {
        _size = size;
    }


    public void Validate(ServiceEndpoint endpoint)
    {            
    }

    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {         
    }

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {            
    }

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        clientRuntime.MaxFaultSize = _size;
    }
}

并在创建代理时将其应用于客户端代码中的端点:

_clientProxy.Endpoint.Behaviors.Add(new MaxFaultSizeBehavior(1024000));

或者,没有代理,只需强制客户端添加行为:

_client = new MyServiceClient();
((ClientBase<IMyService>) _client).Endpoint.Behaviors.Add(new MaxFaultSizeBehavior(1024000));

之后一切都会好的。 我花了很多时间寻找答案,希望这有助于某些人。

答案 1 :(得分:0)

您是否尝试过更改maxBufferSize?我认为这是最大化所有设置的一个例子,但我不会直接复制它。

<binding name="BasicHttpBinding_MyService" 
                maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" 
                receiveTimeout="00:40:00" openTimeout="00:40:00" 
                closeTimeout="00:40:00" sendTimeout="00:40:00">
                <readerQuotas maxDepth="2147483647" 
                    maxStringContentLength="2147483647" maxArrayLength="2147483647" 
                    maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
                <security mode="None"/>
</binding>

答案 2 :(得分:0)

对于那些受Visual Basic困扰的人来说,这是@ZlobnyiSerg的出色解决方案的VB版本。 所有功劳归功于他。

Imports System.ServiceModel.Channels
Imports System.ServiceModel.Description
Imports System.ServiceModel.Dispatcher

Public Class MaxFaultSizeBehavior
    Implements IEndpointBehavior

    Private ReadOnly _size As Integer

    Public Sub New(ByVal size As Integer)
        _size = size
    End Sub

    Public Sub Validate(ByVal endpoint As ServiceEndpoint) Implements IEndpointBehavior.Validate
    End Sub

    Public Sub AddBindingParameters(ByVal endpoint As ServiceEndpoint, ByVal bindingParameters As BindingParameterCollection) Implements IEndpointBehavior.AddBindingParameters
    End Sub

    Public Sub ApplyDispatchBehavior(ByVal endpoint As ServiceEndpoint, ByVal endpointDispatcher As EndpointDispatcher) Implements IEndpointBehavior.ApplyDispatchBehavior
    End Sub

    Public Sub ApplyClientBehavior(ByVal endpoint As ServiceEndpoint, ByVal clientRuntime As ClientRuntime) Implements IEndpointBehavior.ApplyClientBehavior
        clientRuntime.MaxFaultSize = _size
    End Sub
End Class