当aspNetCompatibilityEnabled设置为false时,WCF OneWay服务会减慢速度



我在Visual Studio 2017.NET 4.5中创建了一个简单的WCF服务。(添加新项目->WCF服务)。它更改了web.config并将aspNetCompatibilityEnabled设置为true。因此,该服务是在ASP.NET兼容模式下运行的。

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />

该服务有一种OneWay方法:

[OperationContract(IsOneWay = true)]
void DoWork();

实现如下所示:

public void DoWork()
{
var threadId = Thread.CurrentThread.ManagedThreadId;
Debug.WriteLine("Starting..." + threadId);
Thread.Sleep(TimeSpan.FromSeconds(30));
Debug.WriteLine("Finished..." + threadId);
}

这和预期的一样。一个人可以发送请求,然后立即返回并回答。我可以发送许多请求并立即回复。

但是,如果我更改aspNetCompatibilityEnabled="false"并设置

[AspNetCompatibilityRequirements(
RequirementsMode = AspNetCompatibilityRequirementsMode.NotAllowed)] 

在服务类上,服务速度减慢。它只能处理3个请求,第4个请求只是等待。如果没有立即回复,服务不会返回。看起来,它一次只能处理3个请求。

是什么解释了这种行为?每个设置都是默认设置,web.config中没有设置任何特殊设置。

如果您的应用程序托管在IIS中,并且您设置了aspNetCompatibilityEnabled='false',则请求将不会流经ASP.NET http管道。行为缓慢的原因之一可能是,由于请求没有利用管道,IIS需要一些时间来运行接收请求并将其传递给WCF所需的脚本。WCF默认情况下一次只处理一个请求,直到您指定了不同的并发级别。其他请求必须等待,直到上一个请求得到处理。ASP.NET HTTP管道保存请求队列,并一次处理一个请求队列。我相信在这种情况下,由于ASP.NET HTTP管道的优势已经丧失,非ASP.NET管道没有正确处理请求队列。我希望这能回答你的问题。下面提到了一些额外的文件

https://learn.microsoft.com/en-us/dotnet/framework/wcf/feature-details/wcf-services-and-aspnet

https://learn.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/wcf/servicehostingenvironment

最新更新