读书人

WCF性能有关问题大探讨 - 大家多给小弟

发布时间: 2013-07-11 15:38:46 作者: rapoo

WCF性能问题大探讨 -- 大家多给我点建议
本帖最后由 timycg 于 2013-07-01 21:32:24 编辑 最进项目进行性能优化工作,主要是WCF方面的性能优化。

一丶说说我们项目的结构:

  1. 安卓前台,通过创建HTTP请求调用WCF服务

    参考文章:http://blog.csdn.net/cch5487614/article/details/6333077 (安卓怎么调用WCF方法)

  2. WCF后台,主要是提供数据,以及做一些重要的业务逻辑处理



二丶传输格式

  数据传输格式:后台处理安卓前台的请求,返回的对象要通过JSON转化之后才返回给前台

  注意:JSON转化后的字符串长度一般在10000



三丶WCF的配置文件

  1.配置文件:

  
<system.serviceModel>
<services>
<service name="Transight.POS.FrontendService.JsonService.Operations" behaviorConfiguration="FrontendService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="httpBinding_Config" contract="Transight.POS.FrontendService.Contracts.IJsonOperation" >
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://192.168.23.8/FrontendWebService/"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="FrontendService">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceThrottling maxConcurrentCalls="8000" maxConcurrentInstances="8000" maxConcurrentSessions="8000"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="httpBinding_Config" maxReceivedMessageSize="2147483647" useDefaultWebProxy="false" textEncoding="utf-8" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" messageEncoding="Text" sendTimeout="00:10:00">


<security mode="None"></security>
<readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647"/>
</binding>
</basicHttpBinding>
<netNamedPipeBinding>
<binding name="PipeBinding" maxConnections="100" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" sendTimeout="00:10:00">
<security mode="None" ></security>
<readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647"/>
</binding>
</netNamedPipeBinding>
</bindings>
</system.serviceModel>



2. 实例模型和并发模型的设置:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
               UseSynchronizationContext = false,
               ConcurrencyMode = ConcurrencyMode.Multiple,
               IncludeExceptionDetailInFaults = true)]
  

   注意:项目中每一个方法中的执行时间都不会超过一秒(项目中的代码优化已经做到很好了,一般情况下都没有问题)。


三丶尝试的解决方案

  1. 字符串压缩

  2. 调整限流设置 - serviceThrottling

  3. 增大WCF并发时的线程数量

    参考:http://www.cnblogs.com/shanyou/archive/2013/02/09/2909569.html

  通过这样修改后感觉效果不是很明显。

  

四丶测试结果

  同时开启500个线程去调用WCF服务方法,得到的数据是:

  最后面是调用时间,单位为毫秒。
WCF性能有关问题大探讨 - 大家多给小弟我点建议

  WCF性能有关问题大探讨 - 大家多给小弟我点建议
(图片上传上去了,可是就是显示不了)

  现象:调用的时间会一直在增加,最终的时间为200毫秒。


五丶疑问

  1. 为什么调用时间一直在增加,我不是设置了并发模型了,怎么会这样?

  2. JSON的大字符串传输有什么好的办法解决?

  3. 有没有人有安卓调用WCF的性能优化经验?



最后希望大家给我点建议。 性能优化 WCF? Android


[解决办法]
你的所谓“大字符串”,如果是传图片,就真的太奢侈了。你把byte[]编码了(长了许多)而且再经过xml层层封装,实在是不值。这就使用简单的http post传送二进制流内容(再url参数中可以有个别参数)就可以了。
[解决办法]
你们把图片存在数据库 会不会是程序和数据库交互遇到了瓶颈 检查一下这个看看
[解决办法]
Multiple 还是 Single
如果是Single,将ReleaseServiceInstanceOnTransactionComplete属性设成True,这样事务结束之后将封装了服务实例的InstanceContext对象释放掉;
Multiple 的话,状态管理就要自己代码处理维护。

没有细测过WCF ;不敢多言,只能帮顶了...

读书人网 >C#

热点推荐