2014-03-25 36 views
0

在IIS 8.0中承載的wcf應用程序(.NET FW 4.0)中,我希望將具有兩個大字符串的複雜DataMember作爲參數發送。這些字符串可以達到20 MB或更多。首先我使用transferMode = Streamed,但我總是得到錯誤:傳輸具有大字符串的DataMember

Additional information: The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:request . The InnerException message was 'There was an error deserializing the object of type QCheckerService.Parameter. The maximum string content length quota (8192) has been exceeded while reading XML data. This quota may be increased by changing the MaxStringContentLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader.

我在配置文件中將readerQuotas全部設置爲max。但是錯誤與XmlDictionaryReaderQuotas有關。有沒有辦法避免在代碼中更改這些配額?

我現在有點困惑什麼可能是一個合適的解決方案。是默認的transferMode =緩衝正確的方式來做到這一點?

或者是不可能傳輸大的字符串,我應該用另一種方式?

如果我傳輸小字符串,它的工作原理。這裏是額外的配置。

客戶端的app.config:

<system.serviceModel> 
    <client> 
    <endpoint address=http://localhost:12412/Service1.svc 
       binding="basicHttpBinding" 
       bindingConfiguration="BasicHttpBinding_IQChecker" 
       contract="QCheckerService.IQChecker"> 
    </client> 
    <bindings> 
    <basicHttpBinding> 
     <binding name="BasicHttpBinding_IQChecker" 
        maxBufferSize="2147483647" 
        maxBufferPoolSize="2147483647" 
        maxReceivedMessageSize="2147483647" 
        transferMode="Streamed"> 
     <readerQuotas maxDepth="32" 
         maxStringContentLength="2147483647" 
         maxArrayLength="2147483647" 
         maxBytesPerRead="2147483647" 
         maxNameTableCharCount="2147483647" /> 
     </binding> 
    </basicHttpBinding> 
    </bindings> 
</system.serviceModel> 

服務的web.config:

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
    <bindings> 
    <basicHttpBinding> 
     <binding name="Basic" 
       maxReceivedMessageSize="2147483647" 
       maxBufferSize="2147483647" 
       maxBufferPoolSize="2147483647" 
       transferMode="Streamed"> 
     <readerQuotas maxBytesPerRead="2147483647" 
         maxDepth="32" 
         maxStringContentLength="2147483647" 
         maxArrayLength="2147483647" 
         maxNameTableCharCount="2147483647" /> 
     </binding> 
    </basicHttpBinding> 
    </bindings> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior> 
     <serviceMetadata httpGetEnabled="true"/> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

服務接口相關的數據成員

[OperationContract] 
[WebInvoke(Method = "POST", UriTemplate = "MyMethod", BodyStyle = WebMessageBodyStyle.Bare)] 
ReturnValue MyMethod (Parameter request); 

[DataContract] 
public class Parameter: IDisposable 
{ 
    [DataMember] 
    String String1; 

    [DataMember] 
    String String2; 

    public void SetString1(String drawing) 
    { 
     String1 = drawing; 
    } 

    public String GetString1() 
    { 
     return String1; 
    } 

    public void SetString2(String configuration) 
    { 
     String2 = configuration; 
    } 

    public String GetString2() 
    { 
     return String2; 
    } 

    public void Dispose() 
    { 

    } 

感謝您一些建議。

+0

如果你想有一個正確的答案,包括您的相關web.config設置和至少一個方法簽名。 – EkoostikMartin

+1

該問題可能在客戶端配置中,因此也包括客戶端配置文件。 – Sphinxxx

+0

這個異常消息似乎明確地說明了問題所在。 –

回答

0

在您的服務的配置文件中,您已經定義了名稱爲「Basic」的basicHttpBinding。但是,您沒有顯式定義服務的端點,因此默認情況下,框架將在服務文件的位置公開帶有basicHttpBinding的端點。此默認端點將使用默認basicHttpBinding - 換句話說,您定義的綁定根本不使用。

解決此問題的兩種方法(在WCF 4.0+中):您必須a)通過名稱將該綁定分配給顯式端點(也在配置文件中定義)或b)將其設置爲默認端點綁定該傳輸協議。

對於選項,你將端點添加到您的服務的配置文件:

<services> 
    <service name="Your service name"> 
    <endpoint address="" 
       binding="basicHttpBinding" 
       bindingConfiguration="Basic" 
       contract="QCheckerService.IQChecker" /> 
    </service> 
</services> 

對於選項B,你可以讓你通過在綁定定義ommitting的name屬性指定爲默認的配置,像這樣:

<bindings> 
    <basicHttpBinding> 
    <binding maxReceivedMessageSize="2147483647" 
      maxBufferSize="2147483647" 
      maxBufferPoolSize="2147483647" 
      transferMode="Streamed"> 
     <readerQuotas maxBytesPerRead="2147483647" 
        maxDepth="32" 
        maxStringContentLength="2147483647" 
        maxArrayLength="2147483647" 
        maxNameTableCharCount="2147483647" /> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

以上綁定定義將被用於使用該配置文件,並basicHttpBinding所有服務。

有關默認綁定,端點和行爲的更多信息,請參閱A Developer's Introduction to Windows Communication Foundation 4