WCF - вернуть большой набор данных клиенту - PullRequest
0 голосов
/ 09 января 2020

Цель состоит в том, чтобы отправить содержимое таблицы в виде набора данных клиенту. Я получаю сообщение об ошибке из клиентского приложения:

"Превышена квота максимального размера сообщения для входящих сообщений (65536)."

Хотя в том же приложении WCF получение большого объема данных от клиента, ошибки нет. Пожалуйста, смотрите файл конфигурации.

<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="false" multipleSiteBindingsEnabled="true"/>

<bindings>
  <wsHttpBinding>
    <binding name="TeansferBinding" 
             messageEncoding="Mtom" 
             maxBufferPoolSize="2147483647" 
             maxReceivedMessageSize="2147483647" 
             receiveTimeout="00:10:00">
      <readerQuotas maxDepth="2147483647" 
                    maxStringContentLength="2147483647" 
                    maxArrayLength="2147483647"/>
      <!-- 
        For forced HTTPS
        change the security mode from None to Transport and add Transport key with clientCredentialType="None"
        <security mode="Transport">
          <transport clientCredentialType="None"/>
        </security
      -->
      <security mode="None" />
    </binding>
    <binding name="ProjectBinding"
             messageEncoding="Text"
             maxBufferPoolSize="2147483647"
             maxReceivedMessageSize="2147483647"
             receiveTimeout="00:10:00">
      <readerQuotas maxDepth="2147483647"
                    maxStringContentLength="2147483647"
                    maxArrayLength="2147483647"/>
      <!-- 
        For forced HTTPS
        change the security mode from None to Transport and add Transport key with clientCredentialType="None"
        <security mode="Transport">
          <transport clientCredentialType="None"/>
        </security
      -->
      <security mode="None" />
    </binding>
  </wsHttpBinding>
</bindings>

<behaviors>
  <serviceBehaviors>

    <behavior name="TransferBehavior">
      <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false"/>
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. -->
      <!-- Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="true"/>
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
      <serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" maxConcurrentInstances="500"/>
    </behavior>

  </serviceBehaviors>
</behaviors>

<services>

  <service behaviorConfiguration="TransferBehavior" name="TransferServer.Restore" >
    <endpoint address="" 
              binding="wsHttpBinding" 
              bindingConfiguration="TeansferBinding" 
              contract="TransferServer.IRestore"/>
    <!-- remove mex endpoint of production server -->
    <endpoint address="mex" 
              binding="mexHttpBinding" 
              name="Mex" 
              contract="IMetadataExchange"/>
    <host>
      <timeouts closeTimeout="00:10:00" openTimeout="00:10:00"/>
    </host>
  </service>

  <service behaviorConfiguration="TransferBehavior" name="TransferServer.ProjectProvider">
    <endpoint address="" 
              binding="wsHttpBinding" 
              bindingConfiguration="ProjectBinding" 
              contract="TransferServer.IProjectProvider"/>
    <!-- remove mex endpoint of production server -->
    <endpoint address="mex" 
              binding="mexHttpBinding" 
              name="Mex" 
              contract="IMetadataExchange"/>
    <host>
      <timeouts closeTimeout="00:10:00" openTimeout="00:10:00"/>
    </host>
  </service>

</services>

Я искал решение, но вернулся только к настройке файла конфигурации. Приложение WCF не сообщает о какой-либо ошибке, а клиент сообщает об ошибке.

Я попытался использовать wsHttpBinding и basicHttpBinding, но безуспешно. Я пробовал MTOM и кодирование текстовых сообщений.


@ Abraham Qian

Файл конфигурации приложения для клиента

Вот приложение. Файл конфигурации для клиента.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IRestore" messageEncoding="Mtom">
                    <security mode="Transport">
                        <transport clientCredentialType="None" />
                    </security>
                </binding>
                <binding name="WSHttpBinding_IProjectProvider">
                    <security mode="Transport">
                        <transport clientCredentialType="None" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="https://myServer.com/Restore.svc"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IRestore"
                contract="RestoreProvider.IRestore" name="WSHttpBinding_IRestore" />
            <endpoint address="https://myServer.com/ProjectProvider.svc"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IProjectProvider"
                contract="ProjectProvider.IProjectProvider" name="WSHttpBinding_IProjectProvider" />
        </client>
    </system.serviceModel>
</configuration>

Что касается информации о привязке для службы ProjectProvider, единственным отличием является "maxBufferSize", который при вставке создает ошибку.

Код использования в Клиент

Public sub GetZips()
    'Get the information from Ops
    Using oProjectProvider As New ProjectProvider.ProjectProviderClient
        MyDataSet = oProjectProvider.GetZipCodeData
        oProjectProvider.Close()
    End Using
    Application.DoEvents()
End sub

1 Ответ

1 голос
/ 13 января 2020

Я хотел бы знать конфигурацию клиента. как вы создаете звонок в сервис? Нам лучше применить конфигурацию как на стороне клиента, так и на стороне сервера. Кроме того, я подозреваю, что с адресом конечной точки службы клиента что-то не так. Пожалуйста, опубликуйте полную конфигурацию клиента.
Кроме того, обратитесь к приведенной ниже конфигурации.

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

Не стесняйтесь, дайте мне знать, если проблема все еще существует.

...