WCF性能与简单ASP.NET HttpHandler
TL;DR ver:WCF服务的行为(尽管它似乎配置为HTTP上的最大吞吐量)比原始ASP.NET处理程序实现慢4倍WCF性能与简单ASP.NET HttpHandler,asp.net,wcf,performance,http,httphandler,Asp.net,Wcf,Performance,Http,Httphandler,TL;DR ver:WCF服务的行为(尽管它似乎配置为HTTP上的最大吞吐量)比原始ASP.NET处理程序实现慢4倍 [ServiceBehavior( ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)] public class Service1 : IService1 { public int GetData() {
[ServiceBehavior(
ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = InstanceContextMode.Single)]
public class Service1 : IService1
{
public int GetData()
{
return 23;
}
}
更新1: 切换到发布模式和IIS(完全非express)7.5更改的编号:
- ASP.NET:从15秒到6.7秒
- WCF:从60秒到13.7秒
详细解释: 我一直在寻找一种有效的方法,在两台不同的物理机器之间的intranet中快速传输信息(命名管道是不可能的)。我的通信合同由以下操作组成:
void SetUserAsState1(int id);
void SetUserAsState2(int id);
byte GetUserState(int id);
我觉得很简单。我不会考虑安全性、可靠性等,只考虑性能。至于性能,我指的是每秒可以向另一台机器发送多少请求
我已经在我的笔记本电脑上对两种情况进行了测试:
- 一个ASP.NET空网站,带有一个通用的GetData.ashx处理程序,可以像http://localhost:1234/GetData.ashx?op=1&id=239 (已使用IIS Express)
- 承载在IIS(Express)中的WCF服务,具有basicHttpBinding
- ASP.NET:15秒
- WCF:60秒
WCF合同:
[ServiceContract]
public interface IService1
{
[OperationContract]
int GetData();
}
和实施
[ServiceBehavior(
ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = InstanceContextMode.Single)]
public class Service1 : IService1
{
public int GetData()
{
return 23;
}
}
和配置:
<services>
<service behaviorConfiguration="beh" name="IService1">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttp"
contract="WcfService1.IService1" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="basicHttp" allowCookies="false" />
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="beh">
<serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000" />
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
我已将concurency模式设置为多个(因此它们不同步)、单个服务实例化、限制设置为高值,不知道是否/如何再加速WCF服务。WCF服务是否会赶上ASP.NET服务(即通过HTTP实现的服务)?Tcp不可能实现?
您可以从序列化中获得更高的性能—尝试NetDataContractSerialization或protobuf.net。您可以缓存通道工厂-因此不需要添加服务引用。不,NetTcpBinding并不是不可能的。我设置它时有些头疼,所以我暂时把它送到pzd_ms。另外,basicHttpBinding提供了与ASP.NET更为均衡的比较。如果所有其他选项都用完,我将稍后尝试TCP:)还有一个设置我在服务器上忘记了-与启用gc相关的smth。在一个生产环境中,使用异步WCF、默认序列化、使用netTcp并且没有安全性(是的,生产环境,没有给出shhhh的名称),我在客户机和服务器之间的往返时间为40-50毫秒。由于netTcp的激活,第一个请求持续了稍长一点,但在那之后,它就轻而易举地完成了。
<services>
<service behaviorConfiguration="beh" name="IService1">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttp"
contract="WcfService1.IService1" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="basicHttp" allowCookies="false" />
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="beh">
<serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000" />
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />