AspNetCompatibilityRequirements导致WCF Web服务阻止

时间:2011-02-16 17:24:26

标签: 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

但是,如果我设置

aspNetCompatibilityEnabled="true"

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

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

我甚至设置了

[ServiceContract(SessionMode=SessionMode.NotAllowed)]

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

1 个答案:

答案 0 :(得分:6)

这是ASP.NET本身的设计 - 检查concurrent requests and session state。一旦打开AspNetCompatibilityEnabled,你总是要处理它 - 我没有尝试过,但我希望唯一的选择是关闭配置文件中的会话。

<configuration>
  <system.web>
    <sessionState mode="Off" />
  </system.web>
</configuration>  

但是你的测试仍然不太现实。当AspNetCompatibilityEnabled关闭时,它将并行执行,但我希望如果您从不同的计算机运行该页面,您将无法并行执行多于两个请求。原因是默认情况下使用HTTP持久连接。通过HTTP规范,只能向同一服务器打开2个HTTP持久连接=只能执行两个并行请求(last paragraph before chapter 8.2)。 Windows遵循这些建议。

修改

thread on MSDN forum讨论了同样的问题。它还提供了一些解决方案。