首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2013-07-11 
WCF性能问题大探讨 -- 大家多给我点建议本帖最后由 timycg 于 2013-07-01 21:32:24 编辑最进项目进行性能

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 ;不敢多言,只能帮顶了...

热点排行