当asp.netCompatibilityEnabled设置为false时,WCF OneWay服务变慢
我在Visual Studio 2017,.NET 4.5中创建了一个简单的WCF服务。 (添加新项目 - > WCF服务)。它更改了web.config
并将aspNetCompatibilityEnabled
设置为true
。所以,该服务正在ASP.NET兼容模式下运行。当asp.netCompatibilityEnabled设置为false时,WCF OneWay服务变慢
<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://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/wcf-services-and-aspnet
关闭“aspNetCompatibilityEnabled”是否安全?可能会出现什么问题? –
关闭兼容性是安全的,但如果要同时处理多个请求,请查看不同的WCF限制选项。 – BipinR
当时的服务,并它aspNetCompatibility设置为false – BipinR
是的,没错,这就是点之前处理超过3个请求。 –