如何提高WCF的执行效率
2个回答
2015-09-15
展开全部
WCF服务对于开发人员来说是非常重要的,它的使用为我们解决了许多难以解决的问题。WCF效率的提高方法有很多注意点,例如何时应该使用OneWay、何时异步。
WCF知识结构学习经验总结
WCF异步调用在客户端中执行方法介绍
提高WCF安全性认知程度
WCF回调特殊使用技巧分享
WCF自承载实践心得分享
WCF的客户端代理类全都实现了INotifyPropertyChanged,我却几乎从来没有见过有人问这个问题。实际上,客户端程序可以不知道WCF的存在,它仅需要调用一个“业务数据GateWay”,这个GateWay再负责数据处理。
这样,测试GUI程序的逻辑时,仅需要测试这个GateWay的逻辑以提高WCF效率。当使用WCF异步获取数据时,可以将数据刷新到GateWay中,例如(对于简单类型):
static public void Refresh
(this IExtensibleDataObject
obj, IExtensibleDataObject target)
{
if (!obj.GetType().
IsAssignableFrom(target.GetType()))
throw new NotSupportedException();
foreach (PropertyDescriptor
p in TypeDescriptor.GetProperties(obj))
p.SetValue(target, p.GetValue(obj));
}
之后GateWay就会自动通知客户端UI程序更新。这样做,GUI程序才看起来运行顺畅。
以上就是WCF效率提高的具体方法介绍。
WCF知识结构学习经验总结
WCF异步调用在客户端中执行方法介绍
提高WCF安全性认知程度
WCF回调特殊使用技巧分享
WCF自承载实践心得分享
WCF的客户端代理类全都实现了INotifyPropertyChanged,我却几乎从来没有见过有人问这个问题。实际上,客户端程序可以不知道WCF的存在,它仅需要调用一个“业务数据GateWay”,这个GateWay再负责数据处理。
这样,测试GUI程序的逻辑时,仅需要测试这个GateWay的逻辑以提高WCF效率。当使用WCF异步获取数据时,可以将数据刷新到GateWay中,例如(对于简单类型):
static public void Refresh
(this IExtensibleDataObject
obj, IExtensibleDataObject target)
{
if (!obj.GetType().
IsAssignableFrom(target.GetType()))
throw new NotSupportedException();
foreach (PropertyDescriptor
p in TypeDescriptor.GetProperties(obj))
p.SetValue(target, p.GetValue(obj));
}
之后GateWay就会自动通知客户端UI程序更新。这样做,GUI程序才看起来运行顺畅。
以上就是WCF效率提高的具体方法介绍。
推荐于2016-06-18 · 知道合伙人软件行家
关注
展开全部
下面是我的各处配置: <bindings>
<customBinding>
<binding name="myMexTcpBinding">
<binaryMessageEncoding>
<readerQuotas maxDepth="32" maxStringContentLength="819200" maxArrayLength="1638400" maxBytesPerRead="409600" maxNameTableCharCount="1638400"/>
</binaryMessageEncoding>
<tcpTransport maxBufferPoolSize="524288000" maxReceivedMessageSize="65536000" maxBufferSize="65536000"/>
</binding>
<binding name="mybinding">
<binaryMessageEncoding>
<readerQuotas maxDepth="32" maxStringContentLength="819200" maxArrayLength="1638400" maxBytesPerRead="409600" maxNameTableCharCount="1638400"/>
</binaryMessageEncoding>
<tcpTransport maxBufferPoolSize="524288000" maxReceivedMessageSize="65536000" maxBufferSize="65536000"/>
</binding>
</customBinding>
</bindings>
<service behaviorConfiguration="MyBehavior" name="Services.BaseDataManage.BaseDataManage">
<endpoint address="" binding="customBinding" bindingConfiguration="mybinding" contract="Services.BaseDataManage.IBaseDataManage">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="customBinding" bindingConfiguration="myMexTcpBinding" contract="IMetadataExchange"/>
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8802/BaseDataManage/"/>
</baseAddresses>
</host>
</service>
<behavior name="MyBehavior">
<serviceMetadata httpGetEnabled="false"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceTimeouts transactionTimeout="23:59:59"/>
<serviceThrottling maxConcurrentCalls="1000" maxConcurrentSessions="1000" maxConcurrentInstances="1000"/>
</behavior>
[ServiceContract(CallbackContract=typeof(IBaseDataCallBack))]
public partial interface IBaseDataManage
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall)]
public partial class BaseDataManage : IBaseDataManage
wcfbindingbehavior
性能不好的原因很多:
1、事务:事务是需要同步上下文和会话,因此发生阻塞,若达到会话连接最高值,之后的会话需排队甚至超时;解决:将支持事务与非事务的服务分开成不同的服务;
2、回调:回调需要采用独立线程或线程池执行回调操作,否则可能在回调时因掉线、长时间运算、超时等因素造成会话一直占用或长时间占用,尽可能在设计上让服务IsOneWay=true;
3、在服务器资源允许的情况下:采用InstanceContextMode.PerCall,UseSynchronizationContext=false,ConcurrencyMode = ConcurrencyMode.Multiple,这种能最大的并发应用。
4、吞吐量配置,我不知道配置文件如何配,我自己是写了一个ServiceThrottlingAttribute,继承Attribute和IServiceBehavior,最后配置最大连接数 MaxConcurrentSessions (WCF默认为10),上下文实例数 MaxConcurrentInstances,最大待处理消息数或回调数,MaxConcurrentCalls(WCF默认64),
5、以上仅是我配置过的,可能有些解释不正确,但通过这样的改动后,并发和性能都得到很大的提升,由于我这里是工作流服务,目前最高有3000-5000工作流在同时运行,并没有发生明显的阻塞
<customBinding>
<binding name="myMexTcpBinding">
<binaryMessageEncoding>
<readerQuotas maxDepth="32" maxStringContentLength="819200" maxArrayLength="1638400" maxBytesPerRead="409600" maxNameTableCharCount="1638400"/>
</binaryMessageEncoding>
<tcpTransport maxBufferPoolSize="524288000" maxReceivedMessageSize="65536000" maxBufferSize="65536000"/>
</binding>
<binding name="mybinding">
<binaryMessageEncoding>
<readerQuotas maxDepth="32" maxStringContentLength="819200" maxArrayLength="1638400" maxBytesPerRead="409600" maxNameTableCharCount="1638400"/>
</binaryMessageEncoding>
<tcpTransport maxBufferPoolSize="524288000" maxReceivedMessageSize="65536000" maxBufferSize="65536000"/>
</binding>
</customBinding>
</bindings>
<service behaviorConfiguration="MyBehavior" name="Services.BaseDataManage.BaseDataManage">
<endpoint address="" binding="customBinding" bindingConfiguration="mybinding" contract="Services.BaseDataManage.IBaseDataManage">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="customBinding" bindingConfiguration="myMexTcpBinding" contract="IMetadataExchange"/>
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8802/BaseDataManage/"/>
</baseAddresses>
</host>
</service>
<behavior name="MyBehavior">
<serviceMetadata httpGetEnabled="false"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceTimeouts transactionTimeout="23:59:59"/>
<serviceThrottling maxConcurrentCalls="1000" maxConcurrentSessions="1000" maxConcurrentInstances="1000"/>
</behavior>
[ServiceContract(CallbackContract=typeof(IBaseDataCallBack))]
public partial interface IBaseDataManage
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall)]
public partial class BaseDataManage : IBaseDataManage
wcfbindingbehavior
性能不好的原因很多:
1、事务:事务是需要同步上下文和会话,因此发生阻塞,若达到会话连接最高值,之后的会话需排队甚至超时;解决:将支持事务与非事务的服务分开成不同的服务;
2、回调:回调需要采用独立线程或线程池执行回调操作,否则可能在回调时因掉线、长时间运算、超时等因素造成会话一直占用或长时间占用,尽可能在设计上让服务IsOneWay=true;
3、在服务器资源允许的情况下:采用InstanceContextMode.PerCall,UseSynchronizationContext=false,ConcurrencyMode = ConcurrencyMode.Multiple,这种能最大的并发应用。
4、吞吐量配置,我不知道配置文件如何配,我自己是写了一个ServiceThrottlingAttribute,继承Attribute和IServiceBehavior,最后配置最大连接数 MaxConcurrentSessions (WCF默认为10),上下文实例数 MaxConcurrentInstances,最大待处理消息数或回调数,MaxConcurrentCalls(WCF默认64),
5、以上仅是我配置过的,可能有些解释不正确,但通过这样的改动后,并发和性能都得到很大的提升,由于我这里是工作流服务,目前最高有3000-5000工作流在同时运行,并没有发生明显的阻塞
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询