2011-11-02 23 views
0

我目前正在嘗試在使用WCF,WShttpBinding的Winform應用程序中創建Web服務。其中一種方法返回一個字典。客戶端,RTD服務器將調用此方法來檢索字典。使用WCF,WSBinding發送字典

出於某種原因,當字典變得太大(0.6MB +)時,會引發通信異常。我試圖在客戶端和服務器端增加以下參數的大小,但它仍然不會工作。有人能告訴我我做錯了什麼嗎?謝謝。

binding.MaxReceivedMessageSize 
binding.MaxBufferPoolSize 
binding.SendTimeout 
binding.OpenTimeout 
binding.ReceiveTimeout 
binding.ReaderQuotas.MaxStringContentLength 
binding.ReaderQuotas.MaxDepth 
binding.ReaderQuotas.MaxBytesPerRead 
+1

這是否解決問題了嗎? http://stackoverflow.com/questions/3426490/wcf-service-communication-exception-due-to-parameter-size – mlessard

+0

請提供例外,以獲得確切的解決方案,也考慮在服務和客戶端更改綁定參數雙方。我的一般猜測是,嘗試返回與列表(T)相同的數據來代替字典可以修復該問題。 –

+0

以下是異常中的以下消息:接收對http:// localhost:8000/ServerName/Service/Service的HTTP響應時發生錯誤。這可能是由於服務端點綁定不使用HTTP協議。這也可能是由於HTTP請求上下文被服務器中止(可能是由於服務關閉)。查看服務器日誌獲取更多詳細信我肯定在服務器和客戶端都使用WShttpBinding,我不知道怎麼回事。 – Koda

回答

3

App.config文件添加一個behavior配置:

  • 在服務器上:

 

<behaviors> 
    <serviceBehaviors> 
     <behavior name="MyServiceBehavior"> 
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 
  • 在CLIEN T:

 

<behaviors> 
    <endpointBehaviors> 
     <behavior name="MyClientBehavior"> 
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
     </behavior> 
    </endpointBehaviors> 
</behaviors> 

注意2147483647是最大值,也許你並不需要那麼多。


而且不要忘記引用的行爲在你的服務和端點:

  • 在您的服務器(和你的客戶,如果它擁有一些服務):

 

<service name="SomeService" behaviorConfiguration="MyServiceBehavior"> 
    <endpoint binding="WShttpBinding" 
       bindingConfiguration="MyBindingConf" 
       contract="SomeContract"/> 
</service> 
  • 在客戶端:

 

<endpoint binding="WShttpBinding" 
      bindingConfiguration="MyBindingConf" 
      behaviorConfiguration="MyServiceBehavior" 
      contract="SomeContract" 
      name="SomeName" /> 
+0

有沒有辦法做到這一點以外的app.config文件? RTD服務器是excel的一部分。我之前遇到了從app.config讀取的問題,所以我一直在代碼中創建綁定。謝謝 – Koda

+0

@Alvin:對不起,也許這是可能的,但我不知道如何。 'maxItemsInObjectGraph'能解決你的問題嗎? – Otiel

+0

RTD服務器作爲Excel的一部分運行,因此您可以將該服務的配置添加到Excel的app.config(Excel.exe.config)中。不知道這是否是最好的解決方案:S – Franchesca