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