当aspNetCompatibilityEnabled设置为false

时间:2017-10-20 15:08:54

标签: c# asp.net .net web-services wcf

我在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中没有设置任何特殊设置。

1 个答案:

答案 0 :(得分: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