【问题标题】:Forcing asmx web service to handle requests one at a time强制 asmx Web 服务一次处理一个请求
【发布时间】:2009-05-01 07:24:28
【问题描述】:

我正在调试一个接收“突发”请求的 ASMX Web 服务。即,Web 服务很可能会在大约 1 或 2 秒内收到 100 个异步请求。每个请求似乎需要大约一秒钟的时间来处理(这是意料之中的,我对这个性能很好)。然而重要的是,每个请求都是按顺序处理的,不会发生并行处理。由于 Web 服务调用的外部组件,我不希望任何并发请求处理。有什么办法可以强制 Web 服务仅按顺序处理每个响应?

我在 machine.config 中看到了 maxconnection 属性,但这似乎只适用于出站连接,因为我希望限制传入连接。

请注意,此时重构为 WCF 不是一种选择。

我们在 Win2003 上使用 IIS6。

【问题讨论】:

  • @Alex:这些答案对你有帮助吗?您应该为那些有帮助的人投票,这样以后阅读此问题的人就会知道哪些是有帮助的答案。
  • 并非如此。我正在寻找有关 IIS6 在这种情况下如何表现(或可以强制表现)的详细信息。在这种情况下,编程解决方案对我没有好处,我无法升级到 IIS 7。
  • IIS 与问题无关。除了将请求传递给 ASP.NET 之外,不涉及它。
  • 那么,鉴于改变 IIS6 的行为无法解决您的问题,这些答案之一是否有可能解决您的问题?

标签: web-services asmx throttling


【解决方案1】:

我过去所做的只是简单地围绕对我正在使用的外部资源的任何访问添加一个锁定语句。在我的例子中,它是一段声称是线程安全的非托管代码,但实际上如果一次从多个线程访问它会破坏 C 运行时库堆。

【讨论】:

    【解决方案2】:

    也许您应该在内部将请求排队并一一处理?

    这可能会导致客户端轮询结果(如果他们甚至需要它们),但你会得到你想要的顺序管道......

    【讨论】:

    • 客户端的请求都是异步的。我已经研究过在 Web 服务端创建一个队列类,但我认为 IIS 必须有一些用于缓存请求的内部缓冲区,所以我不想(非常)重新发明轮子。
    • 我建议查看 msmq 并通过工作线程/进程处理队列。
    【解决方案3】:

    在 IIS7 中,您可以设置网站允许的连接限制。能用IIS7吗?

    【讨论】:

    • 在最大连接数处于活动状态时到达的传入连接会发生什么情况?他们会被 IIS 排队还是被拒绝?我会检查是否允许我们使用 IIS7。
    • 据我发现,额外的请求在 http.sys 队列中排队,直到有空闲连接。但是,这可能会使客户端应用程序超时。
    • 好吧,这听起来正是我想要的行为。这种行为仅与 IIS 7 相关还是在 6 中也发生?我可以控制客户端超时,所以这不是问题。顺便说一句,您是在哪里找到这些信息的?
    • 我不确定 IIS6,我没有任何可以检查的。如何?好吧,我首先查看了 IIS,因为我记得我已经看到了。比谷歌一点给我的答案是超出限制的连接会发生什么。
    猜你喜欢
    • 1970-01-01
    • 2013-03-27
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 2011-07-12
    • 1970-01-01
    相关资源
    最近更新 更多