Размер буфера в службе WCF - PullRequest
6 голосов
/ 17 марта 2011

У нас есть служба WCF, которая выполняет определенные хранимые процедуры и возвращает результаты клиенту Silverlight.Некоторые из хранимых процедур возвращают до 80К строк.

Ниже приведены настройки в 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>

Всякий раз, когда количество записей превышает 20 КБ, сервисвыдает ошибку как TimeOut или NotFound.Как вы думаете, почему это происходит, и как мне это исправить?

Ответы [ 3 ]

3 голосов
/ 17 марта 2011

Звучит как перегрузка данных.Нумерация страниц, как отмечено в комментариях, является практическим решением.Если есть веская причина хотеть 80 КБ, вы можете попробовать использовать другой механизм для сериализации данных.Например, данные protobuf, как правило, намного меньше, чем xml, поэтому вы можете попробовать использовать их по проводам.Однако, поскольку это Silverlight, я не могу (на данный момент) поменять его автоматически - вам нужно будет вернуть byte[] или Stream и явно обработать сериализацию / десериализацию на сервере / клиенте.Это должно значительно снизить требования к пропускной способности (даже больше, если вы можете настроить Silverlight для использования MTOM - я не проверял в последнее время, но это не поддерживалось в некоторых более ранних выпусках).

2 голосов
/ 30 апреля 2011

Поскольку ваш proc возвращает 80K, вы также должны добавить размер буфера на стороне клиента.

readerQuotas

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

Это должно работать. При необходимости увеличьте размер буфера.

1 голос
/ 30 апреля 2011

Мы успешно использовали сжатие GZIP между клиентом и службой WCF, чтобы увеличить количество строк, которые мы можем отозвать.Также должно работать для ваших нужд.

Мы использовали библиотеки MS для достижения этой цели: http://msdn.microsoft.com/en-us/library/ms751458.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...