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服务方法,得到的数据是:
最后面是调用时间,单位为毫秒。


(图片上传上去了,可是就是显示不了)
现象:调用的时间会一直在增加,最终的时间为200毫秒。
五丶疑问
1. 为什么调用时间一直在增加,我不是设置了并发模型了,怎么会这样?
2. JSON的大字符串传输有什么好的办法解决?
3. 有没有人有安卓调用WCF的性能优化经验?
最后希望大家给我点建议。 性能优化 WCF? Android
[解决办法]
你的所谓“大字符串”,如果是传图片,就真的太奢侈了。你把byte[]编码了(长了许多)而且再经过xml层层封装,实在是不值。这就使用简单的http post传送二进制流内容(再url参数中可以有个别参数)就可以了。
[解决办法]
你们把图片存在数据库 会不会是程序和数据库交互遇到了瓶颈 检查一下这个看看
[解决办法]
Multiple 还是 Single
如果是Single,将ReleaseServiceInstanceOnTransactionComplete属性设成True,这样事务结束之后将封装了服务实例的InstanceContext对象释放掉;
Multiple 的话,状态管理就要自己代码处理维护。
没有细测过WCF ;不敢多言,只能帮顶了...