2011-01-19 51 views
6

我正在嘗試解決WCF錯誤found in my previous question。基本上,錯誤是:配置WCF <services>標記

讀取XML數據時,已超出最大字符串內容長度配額(8192)。

有人建議在我的web.config中使用服務標籤來解決我的問題。

現在,我面臨着不同的問題。我無法弄清楚我是如何在我的web.config中配置服務標記以在我的服務器上正常工作的。當我嘗試使用服務時,我總是收到以下錯誤:標記:

服務器未提供有意義的回覆;這可能是由於合同不匹配,會話過早關閉或內部服務器錯誤造成的。

這裏是我的web.config與服務標籤說:

<system.serviceModel> 
<bindings> 
    <basicHttpBinding> 
    <binding 
     name="BasicHttpBinding_Service1" 
     closeTimeout="00:01:00" 
     openTimeout="00:01:00" 
     receiveTimeout="00:10:00" 
     sendTimeout="00:01:00" 
     allowCookies="false" 
     bypassProxyOnLocal="false" 
     hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="65536" 
     maxBufferPoolSize="524288" 
     maxReceivedMessageSize="65536" 
     messageEncoding="Text" 
     textEncoding="utf-8" 
     transferMode="Buffered" 
     useDefaultWebProxy="true"> 
     <readerQuotas 
     maxDepth="32" 
     maxStringContentLength="10000" 
     maxArrayLength="16384" 
     maxBytesPerRead="4096" 
     maxNameTableCharCount="16384" /> 
     <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" 
      realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint 
    address="http://localhost:53931/WCF/Service1.svc" 
    binding="basicHttpBinding" 
    bindingConfiguration="BasicHttpBinding_Service1" 
    contract="ServiceReference.Service1" 
    name="BasicHttpBinding_Service1" /> 
</client> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name=""> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<!--PROBLEM SOMEWHERE IN THE SERVICES TAG--> 
<services> 
    <service 
    behaviorConfiguration="NewBehavior" 
    name="AspPersonalWebsite.ServiceReference"> 
    <endpoint 
     address="http://localhost:53931/WCF/Service1.svc" 
     binding="basicHttpBinding" 
     contract="ServiceReference.Service1" 
     bindingConfiguration="BasicHttpBinding_Service1" /> 
    </service> 
</services> 

請注意,通過移除服務標籤一切正常,但後來我將不能夠解決我的原始問題發佈在我的previous question上。

所以有人可以告訴我,如果我在我的web.config上做錯了什麼,特別是在我的服務標籤?!

+0

那麼,真正的問題是:** IS **這真的是你在這裏配置的一項服務?我的意思是服務的服務器端,服務代碼的生存和執行的地方? –

回答

25

好吧,讓我們來解決這個:

首先,你需要定義一個定製basicHttpBinding綁定配置一些自定義設置:

<bindings> 
    <basicHttpBinding> 
    <binding name="LargeSettings" 
      maxBufferSize="524288" 
      maxBufferPoolSize="524288" 
      maxReceivedMessageSize="6553600"> 
     <readerQuotas maxDepth="32" maxStringContentLength="100000" 
         maxArrayLength="16384" maxBytesPerRead="4096" 
         maxNameTableCharCount="16384" /> 
     <security mode="None" /> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

這部分需要在這兩個你服務器 - 端的web.config,以及您的客戶端的配置

其次,在服務器端,你需要有一個<services>標籤定義你的服務和它的端點和它們的配置:

<services> 
    <service name="YourNamespace.YourClassName" 
      behaviorConfiguration="ServiceWithMetadata"> 
     <endpoint name="Default" 
       address="http://localhost:53931/WCF/Service1.svc" 
       binding="basicHttpBinding" 
       bindingConfiguration="LargeSettings" 
       contract="YourNamespace.IServiceContract" /> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
     <behavior name="ServiceWithMetadata"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 

點檢查:

  • 您的服務名稱必須是您的服務類的完全限定名稱(YourNamespace.YourClassName) - 我的類mplements您的服務合同
  • 您的合同在端點服務也必須是服務合同的完全限定域名(YourNamespace.IYourServiceContract
  • <service>標籤的behaviorConfiguration必須引用和完全匹配的name=屬性中定義您<behaviors>部分

而且第三,在客戶端,你需要的東西是這樣的:

<client> 
    <endpoint name="Default" 
      address="http://localhost:53931/WCF/Service1.svc" 
      binding="basicHttpBinding" 
      bindingConfiguration="LargeSettings" 
      contract="ServiceReference.IYourService" /> 
</client> 

您需要引用服務器端服務定義中定義的端點,您需要使用相同的綁定和綁定配置,並且需要使用服務參考中定義的服務協定。

+0

你已經回答了關於服務標籤的問題。但是,我仍然收到:在讀取XML數據時超出了最大字符串內容長度配額(8192)。 :) – ealshabaan

+2

您節省了一天的時間。謝謝 – Qqbt

1

對於使用內置的服務引用,只需使用.Endpoint.Binding =THE NEW BINDING

前那些:

BasicHttpBinding b = new BasicHttpBinding(); 
b.Security.Mode = BasicHttpSecurityMode.Transport; 
... 
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;    

MyWebServiceReference.ServiceReferenceSoapClient objRE = new MyWebServiceReference.ServiceReferenceSoapClient("ServiceReferenceSoap", "URI"); 
objRE.Endpoint.Binding = b; 
-1

使用此設置爲您的綁定,

<basicHttpBinding> 
     <binding maxReceivedMessageSize="2147483647" messageEncoding="Text" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" > 
      <readerQuotas maxStringContentLength="525288"></readerQuotas> 
     </binding> 
     </basicHttpBinding> 
+0

您正在通過在Internet場景中使用這些綁定將您的服務暴露給DOS攻擊。 –

+1

你在這裏基本上說的是,你允許傳入的請求高達2 GB的大小!想象一下,如果黑客發送你的服務10個2 GB的請求會發生什麼。 WCF將嘗試在內存中分配一個2GB緩衝區來存儲每個請求,並可能會失敗。一些失敗後,你的AppPool可能會被終止,你的服務將不再可用。 –