WCF性能使用wsHttpBinding传输对象列表

时间:2011-11-14 13:06:12

标签: c# wcf

我正在尝试使用wsHttpBinding减少在互联网上发送DTO对象列表所需的时间。安全性是TransportWithMessageCredential,带有X509证书。对于列表中的500个对象,时间约为2.5秒,使用basicHttpBinding,没有安全性只能节省几毫秒。

将messageEncoding更改为Mtom似乎进一步降低了速度。我使用svcTraceViewer添加了跟踪和查看文件,显示的最长时间是在发送消息后有一个活动边界然后“服务器安全会话收到来自客户端的关闭消息”,这是1.5秒,转移似乎只需要400毫秒。

我已将以下Context和Concurrency属性添加到服务类

 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession,ConcurrencyMode=ConcurrencyMode.Multiple)]

在DTO课程中,我为数据成员添加了名称以减少反序列化时间

  [Serializable]
[DataContract(Name="Sample")]
public class Sample
{
    [DataMember(Name="Id")]
    public int Id { get; set; }

在服务Web.Config文件中,行为是

  <behaviors>
  <serviceBehaviors>
    <behavior name="MyBehavior">
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
      <serviceMetadata httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
      <serviceThrottling maxConcurrentCalls="300" maxConcurrentSessions="5000"  maxConcurrentInstances="300" />
    </behavior>
    <behavior>
      <serviceMetadata httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>

客户端Web.Config具有

的绑定
   <wsHttpBinding>
    <binding name="MyEndpoint" 
             closeTimeout="00:01:00" 
             openTimeout="00:01:00"
             receiveTimeout="00:10:00" 
             sendTimeout="00:01:00" 
             bypassProxyOnLocal="false"
             transactionFlow="false" 
             hostNameComparisonMode="StrongWildcard"
             maxBufferPoolSize="524288" 
             maxReceivedMessageSize="2147483647"
             messageEncoding="Mtom" 
             textEncoding="utf-8"
             useDefaultWebProxy="false"
             allowCookies="false"  >
      <readerQuotas 
            maxDepth="2147483647" 
            maxStringContentLength="2147483647" 
            maxArrayLength="2147483647"
            maxBytesPerRead="2147483647" 
            maxNameTableCharCount="2147483647" />
      <reliableSession 
            ordered="true" 
            inactivityTimeout="00:10:00"
            enabled="false" />
      <security mode="TransportWithMessageCredential">
        <transport 
            clientCredentialType="None"  />
        <message 
            clientCredentialType="Certificate"  />
      </security>
    </binding>
  </wsHttpBinding>

和行为设置

 <behavior name="MyBehavior">
              <dataContractSerializer maxItemsInObjectGraph="2147483647" />
              <clientCredentials>
                  <clientCertificate findValue="xxxxxxx" storeLocation="LocalMachine" x509FindType="FindByThumbprint" />
              </clientCredentials>
          </behavior>

是否有任何建议如何使其快速和可扩展?

事实证明,gzip实际上并没有像我们假设的那样安装在IIS中。我肯定会测试Marc Gravell的protobuf-net用于生产,但是gzip解决了当前的问题。

3 个答案:

答案 0 :(得分:2)

使用GZip压缩可能会带来很多好处。

答案 1 :(得分:1)

预览PROTOBUFProtocols Buffers Test

您还有一个.net版本:protobuf-net

答案 2 :(得分:1)

带宽时间和序列化/反序列化时间可能是一个因素。此外,传输安全时间将与带宽大小大致相关。我建议你可以在这看一件事就是缩短带宽时间。免责声明:我是作者(但我不卖任何东西;都是免费/ OSS) - 但是:protobuf-net使用密集的数据格式而不是DataContractSerializer,并且有钩子连接到WCF交换序列化器。使用它时, 理想情况下要启用MTOM,因为它是二进制的。这可以明确地或via configuration完成。请注意,如果两端使用汇编共享,它最简单;如果你使用“mex”生成客户端一半,可能会涉及一些额外的步骤。