Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF性能与简单ASP.NET HttpHandler_Asp.net_Wcf_Performance_Http_Httphandler - Fatal编程技术网

WCF性能与简单ASP.NET HttpHandler

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() {

TL;DR ver:WCF服务的行为(尽管它似乎配置为HTTP上的最大吞吐量)比原始ASP.NET处理程序实现慢4倍

[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
我是怎么测试的?我设置了10个线程,每个线程将向目标执行1000个请求,并测量完成所有10x1000=10000个请求所需的时间

结果如何

  • ASP.NET:15秒
  • WCF:60秒
测试线束:(不,这不是产品质量)

默认4.0配置,无更改


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" />