您好,我有一个像这样的简单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服务请求?
答案 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讨论了同样的问题。它还提供了一些解决方案。