Почему Справочник услуг WCF не сохраняет некоторые настройки после обмена метаданными?

Я определяю привязку, как это в моей службе WCF app.config файл:

<bindings>
  <netTcpBinding>
    <binding name="Binding1"
             closeTimeout="00:01:00"
             openTimeout="00:01:00"
             receiveTimeout="00:10:00"
             sendTimeout="00:01:00"
             transactionFlow="false"
             transferMode="Buffered"
             transactionProtocol="OleTransactions"
             hostNameComparisonMode="StrongWildcard"
             listenBacklog="10"
             maxBufferPoolSize="524288"
             maxBufferSize="524288"
             maxConnections="10"
             maxReceivedMessageSize="524288">
      <readerQuotas maxDepth="32"
                    maxStringContentLength="8192"
                    maxArrayLength="16384"
                    maxBytesPerRead="4096"
                    maxNameTableCharCount="16384" />
      <reliableSession ordered="true"
                       inactivityTimeout="00:10:00"
                       enabled="false" />
      <security mode="Message">
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
        <message clientCredentialType="Windows" algorithmSuite="Default" />
      </security>
    </binding>
  </netTcpBinding>
</bindings>

Обратите внимание, что я установил maxBufferSize а также maxReceivedMessageSize быть 524288 байт. В моем клиентском проекте, когда я нажимаю "Добавить ссылку на службу", я могу обнаружить и добавить свою службу. Но это заполняет мой клиент app.config файл как это

<bindings>
  <netTcpBinding>
    <binding name="NetTcpBinding_AgileService" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
      hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="524288"
      maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00"
        enabled="false" />
      <security mode="Message">
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
        <message clientCredentialType="Windows" algorithmSuite="Default" />
      </security>
    </binding>
  </netTcpBinding>
</bindings>

Мне любопытно почему maxBufferSize а также maxReceivedMessageSize вернулись к своим настройкам по умолчанию в моем клиенте app.config, Эти настройки применяются отдельно к клиенту и серверу? Другими словами, могут ли клиент и сервер иметь свои собственные ограничения размера сообщений?

Есть ли что-то еще, что мне нужно сделать на клиенте, чтобы убедиться, что клиент будет готов отправлять сообщения размером 524288 байт? (Я забочусь только о клиенте -> общение с сервером)

2 ответа

Решение

Да, настройки зависят от клиента или сервера (в зависимости от того, с каким конфигом вы работаете). MaxReceivedMessageSize применяется только к размеру сообщения, получаемого службой или клиентом, а не к размеру отправляемого сообщения.

Вы можете увеличить MaxStringContentLength в ReaderQuotas а также для обработки больших сообщений. Кроме того, вам необходимо убедиться, что вы указали свою конфигурацию Binding1 в конечной точке своего сервиса (через bindingConfiguration атрибута) в файле конфигурации вашего сервиса, иначе ваш сервис вернется к настройкам по умолчанию для NetTcpBinding.

Пример:

<services>
  <service behaviorConfiguration="MyBehavior" name="MyService">
    <endpoint address="" binding="netTcpBinding"
              bindingConfiguration="Binding1"
              contract="MyService.IMyContract" />
  </service>
</services>

Обратите внимание на имя MaxReceivedMessageSize. Это о размере данных, которые получатель данных готов принять. Следовательно, вполне вероятно, что клиент и служба будут хотеть разные значения, поэтому они не являются частью сгенерированных значений из метаданных.

Другие вопросы по тегам