2011-04-25 104 views
5

我一直在嘗試搜索這個錯誤,但沒有運氣到目前爲止。上傳大的XML到WCF REST服務 - > 400壞請求

所以,我有我的客戶機上的服務,這web.config中

<system.serviceModel> 
<serviceHostingEnvironment> 
    <baseAddressPrefixFilters> 
    <add prefix="http://www.mywebsite.com/"/> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 
<services> 
    <service behaviorConfiguration="ServiceBehavior" name="UploadService"> 
    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="" 
     contract="IUploadService"> 
     <identity> 
     <dns value="http://www.mywebsites.com/" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="ServiceBehavior" maxReceivedMessageSize="4194304"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

,並在客戶端上我有這個配置

<system.serviceModel> 
<bindings> 
    <wsHttpBinding> 
    <binding name="WSHttpBinding_IUploadService" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:30:00" sendTimeout="00:30:00" 
     bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferPoolSize="524288" maxReceivedMessageSize="4194304" 
     messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
     allowCookies="false"> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
     maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
     <reliableSession ordered="true" inactivityTimeout="00:30:00" 
     enabled="false" /> 
     <security mode="Message"> 
     <transport clientCredentialType="Windows" proxyCredentialType="None" 
      realm=""> 
      <extendedProtectionPolicy policyEnforcement="Never" /> 
     </transport> 
     <message clientCredentialType="Windows" negotiateServiceCredential="true" 
      algorithmSuite="Default" establishSecurityContext="true" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 
<client> 
    <endpoint address="http://www.mywebsite.com/UploadService.svc" 
    binding="basicHttpBinding" bindingConfiguration="" contract="IUploadService" 
    name="WSHttpBinding_IUploadService"> 
    <identity> 
     <dns value="http://www.mywebsite.com/" /> 
    </identity> 
    </endpoint> 
</client> 

和我上傳這樣的文件: -

 using (Stream stream = new FileStream(strFilePath, FileMode.Open, FileAccess.Read)) 
     { 
      try 
      { 
       using (UploadServiceClient upc = new UploadServiceClient()) 
       { 
        upc.UploadFile(stream); 
       } 

      } 
      catch (Exception exc) 
      { 

      } 
     } 

對於小文件它可以正常工作,但對於大型XML文件,這會因400錯誤請求而失敗。我可以做些什麼來改變這些設置以獲取大型XML文件傳輸?

感謝您的幫助和時間

更新的客戶端的app.config

<system.serviceModel> 
<bindings> 
    <basicHttpBinding> 
    <binding name="basicHttpBinding_IUploadService" receiveTimeout="00:20:00" 
     bypassProxyOnLocal="true" maxBufferSize="4194304" maxReceivedMessageSize="4194304" 
     messageEncoding="Mtom" transferMode="Streamed"> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
     maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
     <security> 
     <transport> 
      <extendedProtectionPolicy policyEnforcement="Never" /> 
     </transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint address="http://www.mywebsite.com/UploadService.svc" 
    binding="basicHttpBinding" bindingConfiguration="" contract="IUploadService" 
    name="basicHttpBinding_IUploadService"> 
    <identity> 
     <dns value="http://www.mywebsite.com/" /> 
    </identity> 
    </endpoint> 
</client> 

回答

2

你應該看到如果服務具有相同的maxReceivedMessageSize =「4194304」作爲客戶端,如果XML確實小於設置的4,194,304字節限制。 WCF默認爲64K的maxReceivedMessageSize。

UPDATE:

我注意到你的配置顯示配置用於basicHttpBinding的客戶端,但配置只能顯示的wsHttpBinding。 wsHttpBinding配置將被WCF忽略,因爲它不屬於basicHttpBinding。如果客戶端配置文件沒有basicHttpBinding元素,則在.NET 4中使用默認的一個。如果這是真的,那麼你會遇到上述64K的限制。

+0

是的都是4194K和消息是小於4G – Johann 2011-04-25 16:28:14

+0

我改變了客戶端的app.config文件,並添加了一個basicHTTPBinding,但我仍然得到相同的錯誤 – Johann 2011-04-26 17:52:46

+0

請嘗試替換basicHttpBinding元素(如果有一個)在服務web.config中使用上面顯示的更新中客戶端配置文件中使用的一個。無論它是否有效,我們都會知道客戶端和服務都使用相同的配置。如果您當前在web.config中沒有basicHttpBinding元素,則此更改應該可以解決該問題。 – 2011-04-26 18:30:17