2011-02-16 125 views
10

你好,我有一个简单的wcf服务就像这样,一个简单的睡眠20秒并返回一个值的测试方法。我写了一个测试页面,它使用jquery连续调用它10次,它似乎是同时执行的,客户端等待20秒,然后几乎同时从所有服务中获取结果。AspNetCompatibilityRequirements导致WCF网络服务阻止

[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服务请求启用?

回答

6

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

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

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

编辑:

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

+0

实际上是IE 8. Safari和FireFox可以对同一台服务器执行2个以上的请求。我相信IE 8是6.是的,我从另一台机器确认。 – Tuviah 2011-02-16 23:53:20