我正在尝试使用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解决了当前的问题。
答案 0 :(得分:2)
使用GZip压缩可能会带来很多好处。
答案 1 :(得分:1)
预览PROTOBUF:Protocols Buffers Test
您还有一个.net版本:protobuf-net
答案 2 :(得分:1)
带宽时间和序列化/反序列化时间可能是一个因素。此外,传输安全时间将与带宽大小大致相关。我建议你可以在这看一件事就是缩短带宽时间。免责声明:我是作者(但我不卖任何东西;都是免费/ OSS) - 但是:protobuf-net使用多密集的数据格式而不是DataContractSerializer
,并且有钩子连接到WCF交换序列化器。使用它时, 理想情况下要启用MTOM,因为它是二进制的。这可以明确地或via configuration完成。请注意,如果两端使用汇编共享,它最简单;如果你使用“mex”生成客户端一半,可能会涉及一些额外的步骤。