2017-10-20 132 views
0

我在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

+0

当时的服务,并它aspNetCompatibility设置为false – BipinR

+0

是的,没错,这就是点之前处理超过3个请求。 –

回答

1

如果您的应用程序在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

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

+0

关闭“aspNetCompatibilityEnabled”是否安全?可能会出现什么问题? –

+0

关闭兼容性是安全的,但如果要同时处理多个请求,请查看不同的WCF限制选项。 – BipinR