你好,我有一个像这样的简单的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服务请求?
这是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论坛上的这个帖子讨论了同样的问题.它还提供了一些解决方案.
| 归档时间: |
|
| 查看次数: |
12504 次 |
| 最近记录: |