2011-03-17 158 views
6

我們有一個WCF服務,它執行某些存儲過程並將結果返回給silverlight客戶端。一些存儲過程返回高達80K行。WCF服務中的緩衝區大小

下面給出的web.config中設置服務

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="MyService.MyServiceBehavior"> 
       <serviceMetadata httpGetEnabled="true"/> 
       <serviceDebug includeExceptionDetailInFaults="true"/> 
       <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <basicHttpBinding> 
      <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> 
     </basicHttpBinding> 
     <customBinding> 
      <binding name="MyService.MyService.customBinding0"> 
       <binaryMessageEncoding/> 
       <httpTransport/> 
      </binding> 
     </customBinding> 
    </bindings> 
    <services> 
      <service behaviorConfiguration="MyService.MyServiceBehavior" 
        name="MyService.MyService"> 
       <endpoint name="BasicHttpBinding_MyService" 
        address="" 
        binding="basicHttpBinding" 
        bindingConfiguration="BasicHttpBinding_MyService" 
        contract="MyService.IMyService"/> 
      </service> 
    </services> 
</system.serviceModel> 

而這對於客戶

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="MyService_Behavior"> 
       <serviceDebug includeExceptionDetailInFaults="true"/> 
       <serviceMetadata httpGetEnabled="true"/> 
      </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
      <behavior name="r1"> 
       <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_MyService" 
       closeTimeout="00:03:00" openTimeout="00:03:00" 
       receiveTimeout="00:10:00" sendTimeout="00:03:00" 
       allowCookies="false" bypassProxyOnLocal="false" 
       hostNameComparisonMode="StrongWildcard" 
       maxBufferSize="2147483647" maxBufferPoolSize="2147483647" 
       maxReceivedMessageSize="2147483647" 
       messageEncoding="Text" textEncoding="utf-8" 
       transferMode="Buffered" useDefaultWebProxy="true"> 
       <security mode="None"/> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint name="BasicHttpBinding_MyService" 
      address="http://localhost:8080/MyService/MyService.svc" 
      behaviorConfiguration="r1" 
      binding="basicHttpBinding" 
      bindingConfiguration="BasicHttpBinding_MyService" 
      contract="MyService.IMyService" /> 
    </client> 
</system.serviceModel> 

每當記錄數超越20K,服務拋出一個錯誤或者超時或NotFound。你爲什麼認爲這會發生?我該如何解決?

+1

你確定你想從一個調用返回80K行?也許重構和使用「分頁」結果會更合適? – Jon 2011-03-17 09:57:50

+0

我知道這聽起來很荒謬,但我的用戶很想將它顯示在網格上(當然,我們用分頁顯示它們)。大多數第三方網格像Telerik支持它雖然 – Kev 2011-03-17 09:57:59

+0

你可以試着在multipe calls中獲取這些數據DownloadPage(1)... n你將得到所有的數據,但是以smaler塊 – kalvis 2011-03-17 10:00:58

回答

3

這聽起來像純粹的數據超載。正如評論所指出的,分頁是一個實際的解決方案。如果有充足的理由需要80k,你可以嘗試使用不同的機制來序列化數據。例如,protobuf的數據通常是,其中比xml小,所以你可以嘗試在線路上使用它。但是,由於這是Silverlight,我不能(當前)自動交換它 - 您需要返回byte[]Stream,並在服務器/客戶端顯式處理序列化/反序列化。這應該會降低帶寬要求(如果您可以配置Silverlight以使用MTOM,我最近還沒有檢查過,但在一些早期版本中不支持)。

+0

我同意這個答案。展望未來,顯示結果的最佳方式是在用戶尋找下一頁時獲取更少量的數據。但目前,我需要一個快速解決方案,因爲這個問題發生在生產系統中。 – Kev 2011-03-17 10:32:49

+1

@Kev你*可能*很幸運,並找到一種方法來做到這一點,但並非所有事情都可以通過快速解決。它*可能會更快地停止花時間尋找快速修復,並解決根本問題。 – 2011-03-17 10:43:36

2

由於您的proc返回80K,您還必須在客戶端添加緩衝區大小。

readerQuotas

<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/> 

這應該工作。如果需要增加緩衝區大小。