如何为此nettcpbinding配置实现CustumBinding配置

时间:2011-10-03 13:21:52

标签: wcf nettcpbinding

我有一个nettcpbinding wcf服务。它在一秒钟内调用100000次以上,因此有更多关于性能的问题。我必须对此进行优化。

我的第一个问题是:新接受的连接未在配置的ChannelInitializationTimeout(00:00:05)内从发送方接收初始化数据。结果,连接将中止。如果您处于高度拥挤的网络中,或者您的发送计算机负载过重,请考虑增加此值或对服务器进行负载平衡。

我应该使用CustomBinding设置ChannelInitializationTimeout。我读了一些示例但没有实现配置。

如何在下面的配置中实现自定义绑定配置?

<?xml version="1.0"?>
<configuration>
   <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Warning" propagateActivity="false">
        <listeners>
          <add type="System.Diagnostics.DefaultTraceListener" name="Default">
            <filter type="" />
          </add>
          <add name="ServiceModelTraceListener">
            <filter type="" />
          </add>
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="E:\Services\Ozy3\logs\EventParserService.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp">
        <filter type="" />
      </add>
    </sharedListeners>
    <trace autoflush="true" />
  </system.diagnostics>

  <system.web>
     <compilation debug="true" />
  </system.web>

    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    </startup>

    <system.serviceModel>
    <services>
      <service name="Ozy3.Services.EventParserService" behaviorConfiguration="Ozy3.Services.EventParserServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:3274/EventParserService" />
          </baseAddresses>
        </host>
        <endpoint address="net.tcp://localhost:3273/EventParserService" binding="netTcpBinding" bindingConfiguration="tcp_Unsecured" contract="Ozy3.Domain.Contracts.Service.IEventParserService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
   <bindings>
      <netTcpBinding>
        <binding name="tcp_Unsecured" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="2147483647" maxReceivedMessageSize="2147483647" portSharingEnabled="false" transactionFlow="false" listenBacklog="2147483647" 
        closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00">
          <readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None"></security>
        </binding>
      </netTcpBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="Ozy3.Services.EventParserServiceBehavior">
             <dataContractSerializer maxItemsInObjectGraph="2147483647" />
              <serviceThrottling maxConcurrentCalls="32" maxConcurrentSessions="200" maxConcurrentInstances="232" />  
              <serviceMetadata httpGetEnabled="True" />
              <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

1 个答案:

答案 0 :(得分:0)

我使用.Net的customTcpBinding和Protocol Buffer解决了这个问题,但我知道需要高容量网络才能快速有效地使用nettcpbinding(10GBit以太网和Cat6线缆)

<system.serviceModel>
        <services>
            <service behaviorConfiguration="EventDecoderService.ServiceBehavior"
                name="WcfService1.EventDecoderService">
                <host>
                    <baseAddresses>
                        <add baseAddress="http://192.168.1.67:9001" />
                    </baseAddresses>
                </host>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
                <endpoint address="net.tcp://192.168.1.67:9000" behaviorConfiguration="EventDecoderService.EndpointBehavior"
                    binding="customBinding" bindingConfiguration="customBind"
                    name="EventDecoderService.Endpoint" contract="WcfService1.IEventDecoderService" />
            </service>
        </services>
        <bindings>
            <customBinding>
                <binding name="customBind"
         closeTimeout="00:10:00"
         openTimeout="00:10:00"
         receiveTimeout="00:10:00"
         sendTimeout="00:10:00">
                    <binaryMessageEncoding>
                        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                     maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
                    </binaryMessageEncoding>
                    <tcpTransport maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" hostNameComparisonMode="StrongWildcard"
                                                maxBufferSize="2147483647" maxPendingConnections="100"  channelInitializationTimeout="00:10:00"
                                                transferMode="Buffered" listenBacklog="1000" portSharingEnabled="false" teredoEnabled="false" >
                        <!--<connectionPoolSettings maxOutboundConnectionsPerEndpoint ="1000" />-->
                    </tcpTransport>

                </binding>
            </customBinding>
            <netTcpBinding>
                <binding name="tcp_Unsecured" maxBufferPoolSize="2147483647"
             closeTimeout="10:00:00" receiveTimeout="10:00:00" sendTimeout="10:00:00" openTimeout="10:00:00"
                    maxBufferSize="2147483647" maxConnections="10000" maxReceivedMessageSize="2147483647">
                    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                        maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
                    <security mode="None">
                        <transport clientCredentialType="None" protectionLevel="None" />
                        <message clientCredentialType="None" />
                    </security>
                </binding>
            </netTcpBinding>
        </bindings>
        <behaviors>
            <endpointBehaviors>
                <behavior name="EventDecoderService.EndpointBehavior">
                    <ProtoBufSerialization />
                    <dataContractSerializer maxItemsInObjectGraph="2147483647" />
                </behavior>
            </endpointBehaviors>
            <serviceBehaviors>
                <behavior name="EventDecoderService.ServiceBehavior">
                    <serviceMetadata httpGetEnabled="True" />
                    <serviceDebug includeExceptionDetailInFaults="true" />
                    <dataContractSerializer maxItemsInObjectGraph="2147483647" />
                    <serviceTimeouts transactionTimeout="00:10:10"/>
                    <serviceThrottling
                        maxConcurrentCalls="96"
                        maxConcurrentSessions="600"
                        maxConcurrentInstances="696"
                     />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <extensions>
            <behaviorExtensions>
                <add name="ProtoBufSerialization"
                         type="ProtoBuf.ServiceModel.ProtoBehaviorExtension, protobuf-net, Version=2.0.0.480, Culture=neutral, PublicKeyToken=257b51d87d2e4d67"/>
            </behaviorExtensions>
        </extensions>
    </system.serviceModel>