2014-01-21 25 views
11

我想在WCF應用程序的服務器端拋出FaultException。我正在使用DTO作爲此異常的有效負載。從某個時刻開始,我已經開始在客戶端接收「緩衝XML內容所需的大小超過緩衝區配額」的異常。所有綁定消息大小參數和maxDepth設置爲大enouth值以擺脫懷疑。 有沒有人遇到過這個問題?似乎互聯網上還沒有解決方案。 設置WCF錯誤「緩衝XML內容所需的大小超過緩衝區配額」拋出FaultException時

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

沒有幫助。

回答

11

的問題是在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)); 

之後,一切都會好起來的。 我花了很多時間搜索答案,希望這有助於某人。

+0

有趣的發現。好你發佈答案:) – HockeyJ

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> 
+1

是的,所有這些參數都足夠大,但仍然不起作用。最後我找到了解決辦法,並且很快就會更新我的問題 – ZlobnyiSerg

+0

這不會有幫助。此答案中顯示的尺寸與MaxFaultSize具體有所不同。 – Marcel