【问题标题】:AspNetCompatibilityRequirements causes WCF web service to block [duplicate]AspNetCompatibilityRequirements 导致 WCF Web 服务阻止 [重复]
【发布时间】:2011-02-16 17:24:26
【问题描述】:

你好,我有一个像这样的简单 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 服务调用,所有 10 个请求都需要 2 分钟回来!!

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

我什至设置

[ServiceContract(SessionMode=SessionMode.NotAllowed)]

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

【问题讨论】:

    标签: asp.net wcf


    【解决方案1】:

    这是 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 讨论了同样的问题。它也提供了一些解决方案。

    【讨论】:

    • 其实IE 8。Safari和FireFox可以对同一个服务器执行2个以上的请求。我相信 IE 8 是 6。是的,我从另一台机器上确认了。
    • 关于关闭会话状态不是一个选项。我在其他地方使用 session 来计算并发用户。为什么 ASMX Web 服务能够打开和关闭每个方法的会话状态而 WCF 服务没有。
    • @Tuviah:除非您完全控制客户使用的浏览器,否则您仍然应该计算两个并行请求。例如,我在拥有 10k 台计算机的公司工作,其中 IE6 是标准的,我们正在转向 IE7 ...(是的,这是升级,哈哈)。
    • @Tuviah:顺便说一句。你确定你的服务调用参与了 ASP.NET 会话吗?您的服务端点是如何配置的?
    • 我的服务调用不参与使用会话。我只写了一个服务方法,它简单地休眠 20 秒并返回一个数字。
    猜你喜欢
    • 1970-01-01
    • 2014-09-30
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多