AspNetCompatibilityRequirements导致WCF Web服务阻止

Tuv*_*iah 10 asp.net wcf

你好,我有一个像这样的简单的wcf服务,一个测试方法,它只是睡20秒并返回一个值.我写了一个测试页面,它使用jquery连续10次调用它,它似乎同时执行,客户端等待20秒,然后几乎同时从所有服务返回结果.

 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,ConcurrencyMode=ConcurrencyMode.Multiple,UseSynchronizationContext=false)]
public class AjaxTestWCFService : IAjaxTestWCFService
Run Code Online (Sandbox Code Playgroud)

但是,如果我设置

aspNetCompatibilityEnabled="true"
Run Code Online (Sandbox Code Playgroud)

在web.config然后无论我做什么,使用concurrencymode, usesynchronizationcontext或实例上下文模式,甚至serviceThrottling配置,它似乎按顺序执行每个Web服务调用,所有10个请求返回需要2分钟!

现在我意识到这可能是因为会话,但至少在ASMX服务中我能够将enablesession设置为false.事实上,我的Web服务方法根本不使用会话.所以你可能想知道,为什么要使用它aspNetCompatibilityEnabled.因为我想使用ASP.net模拟和表单身份验证.

我甚至定了

[ServiceContract(SessionMode=SessionMode.NotAllowed)]
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,这是设计的,如何在启用ASP.net兼容性的情况下启用并发Web服务请求?

Lad*_*nka 6

这是ASP.NET本身的设计 - 检查并发请求和会话状态.一旦你打开,AspNetCompatibilityEnabled你总是要处理 - 我没有尝试,但我希望唯一的选择是关闭配置文件中的会话.

<configuration>
  <system.web>
    <sessionState mode="Off" />
  </system.web>
</configuration>  
Run Code Online (Sandbox Code Playgroud)

但是你的测试仍然不太现实.什么时候AspNetCompatibilityEnabled关闭它将并行执行localy但我希望如果你从不同的计算机运行页面,你将无法并行执行两个以上的请求.原因是默认情况下使用HTTP持久连接.通过HTTP规范,只能向同一服务器打开2个HTTP持久连接=只能执行两个并行请求(第8.2章之前的最后一段).Windows遵循这些建议.

编辑:

MSDN论坛上的这个帖子讨论了同样的问题.它还提供了一些解决方案.