Передача большого объема данных через WCF

Я использую WCF в своем проекте для передачи данных с сервера (который обращается к базе данных) и клиента, который отображает данные на экране.

Объем передаваемых данных довольно большой, поэтому я хотел бы знать, как лучше это сделать.

Прямо сейчас я могу запрашивать небольшие объемы данных, около 3600 объектов (отметка времени и двойное значение). Однако, когда это число увеличивается примерно до 86400 объектов, возникает ошибка в вызове сервисной функции.

Мой сервис и клиент объявлены следующим образом:

Сервер:

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata/>
          <dataContractSerializer maxItemsInObjectGraph="6553600"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="serviceName">
        <endpoint binding="netTcpBinding" contract="interfaceName">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:5050/msservice"/>
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>

Клиент:

<system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="NetTcpBinding_IService" closeTimeout="00:02:00" openTimeout="00:02:00" receiveTimeout="00:10:00" sendTimeout="00:02:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxConnections="10"  maxBufferSize="2147483647" maxBufferPoolSize="2147483647">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
          <security mode="Transport">
            <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>
            <message clientCredentialType="Windows"/>
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <client>
      <endpoint address="net.tcp://localhost:5050/msservice" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IService" contract="IService" name="NetTcpBinding_IService">
        <identity>
          <dns value="localhost"/>
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>

person jpnavarini    schedule 17.04.2012    source источник
comment
Вы стрим смотрели? Большие объемы данных и потоковая передача   -  person Tim    schedule 18.04.2012


Ответы (1)


Вы на .net 4? Если нет, я считаю, что вам нужно будет указать имя для поведения службы и связать его со службой.

Изменить: в противном случае можно было бы использовать значение maxItemsInObjectGraph по умолчанию, равное 65536.

<system.serviceModel>
<services>
    <service name="YOURPROJECT.Web.YOURSERVICE"
            behaviorConfiguration="YOURPROJECT-Web-YOURSERVICE">
    </service>
</services>
<behaviors>
    <serviceBehaviors>
        <behavior name="YOURPROJECT-Web-YOURSERVICE">
            <serviceMetadata httpGetEnabled="true" />
            <serviceDebug includeExceptionDetailInFaults="true" />
            <dataContractSerializer maxItemsInObjectGraph="6553600"/>
        </behavior>
    </serviceBehaviors>
</behaviors>
person richk    schedule 17.04.2012
comment
Обратите внимание на свойство maxItemsInObjectGraph, так как это то, что ищет OP. - person Chris; 18.04.2012
comment
Я сделал, и его значение выше, чем то, что должно вызвать ошибку. 6553600 › 86400. По умолчанию 65536. Похоже большее значение не распознается. Может из-за поведения. - person richk; 18.04.2012
comment
Я использую .Net 4. Должен ли я добавить maxItemsInObjectGraph к 6553600 или к 2147483647? - person jpnavarini; 18.04.2012
comment
Ради этого теста я бы выбрал 2147483647. Кроме того, не помешает явно связать поведение со службой. Вы не должны, но можете помочь в устранении неполадок. - person richk; 18.04.2012