为什么WCF服务引用在元数据交换后没有保留一些设置?

时间:2012-01-20 00:31:10

标签: .net wcf wcf-binding nettcpbinding

我在我的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>

请注意,我已将maxBufferSizemaxReceivedMessageSize设置为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>

我很好奇为什么maxBufferSizemaxReceivedMessageSize已恢复为我的客户app.config中的默认值。这些设置是否单独应用于客户端和服务器?换句话说,客户端和服务器是否都有自己的消息大小限制?

我还需要在客户端上做些什么来确保客户端愿意发送524288字节的消息吗? (我只关心客户端 - &gt;服务器通信)

2 个答案:

答案 0 :(得分:1)

是的,这些设置特定于客户端或服务器(取决于您正在处理的配置)。 MaxReceivedMessageSize仅适用于服务或客户端收到的邮件大小,而不是发送邮件的大小。

您可能需要增加MaxStringContentLength中的ReaderQuotas以处理更大的消息。此外,您需要确保在服务的端点中引用服务配置文件中的Binding1配置(通过bindingConfiguration属性),否则您的服务将恢复为NetTcpBinding的默认设置。

示例:

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

答案 1 :(得分:0)

注意MaxReceivedMessageSize的名称。关于数据的大小,数据的接收器准备接受。因此,客户端和服务可能需要不同的值 - 因此这些值不是元数据生成值的一部分