【问题标题】:WCF server-side timeoutWCF 服务器端超时
【发布时间】:2010-11-12 01:54:54
【问题描述】:

有没有办法告诉 WCF 服务在一定时间后响应请求(无论是否中止它的处理),即使它还没有完成,比如服务器端超时策略?

【问题讨论】:

  • 但是如果它没有完成对请求的处理,你想要什么样的响应?
  • 只是故障合同中的一个例外。
  • 如果它没有及时完成,你会得到一个 TimeoutException - 这还不够好吗?
  • @marc_s:我猜你说的是客户端超时,我有一个非 WCF 客户端,无法设置超时。

标签: wcf web-services timeout


【解决方案1】:

我想您可以通过在 WCF 操作开始后立即启动一个新线程来做到这一点。然后真正的工作发生在新线程上,原始 WCF 请求线程使用具有特定超时的 Thread.Join() 等待。如果发生超时,可以使用 Thread.Abort() 取消工作线程。

类似这样的:

public string GetData(int value)
{
    string result = "";
    var worker = new Thread((state) =>
    {
        // Simulate l0ng running
        Thread.Sleep(TimeSpan.FromSeconds(value));
        result = string.Format("You entered: {0}", value);
    });

    worker.Start();

    if (!worker.Join(TimeSpan.FromSeconds(5)))
    {
        worker.Abort();
        throw new FaultException("Work took to long.");
    }

    return result;
}

【讨论】:

  • 谢谢,但我不想在我的工作线程上使用 Thread.Abort,太冒险了。我正在寻找属于 WCF 的内容。
  • AFAIK 没有标准的 WCF 选项可以执行此操作。当请求需要很长时间但服务器不知道这一点时,可以选择让客户端超时,并将继续处理请求并返回结果,即使没有人在监听。顺便说一句,.NET 4.0 任务模型使服务器上的踩踏更好一些。
  • 最终使用了这样一个手动计时器,只是没有中止工人。
【解决方案2】:

我已经解决了同样的问题并创建了一篇博文:

http://kanchengcao.blogspot.com/2012/06/adding-timeout-and-congestion.html

简而言之:

  1. WCF 服务器超时配置不起作用
  2. 您可以像其他人所说的那样实现超时
  3. 这样的超时并不能保证对客户端的及时响应,因为在超时输入您的代码之前,请求可能会排队很长时间。

所以我实现了在服务器过载并预计会导致更多超时时丢弃请求的方法。

【讨论】:

    【解决方案3】:

    我不知道你为什么要这样做 - 你应该编辑你的问题,说出你想要完成的事情。

    如果我必须这样做,那么我会让 Web 服务将请求传递给单独的 Windows 服务,可能通过使用 WCF over MSMQ。我会对该请求超时。如果请求没有及时完成,我会简单地返回一个超时错误。实际请求不会受到影响。

    【讨论】:

    • 这正是我希望 WCF 为我做的事情,只是没有额外进程的开销。
    • 我不相信它会这样做。我以前从未听说过这个要求。也许您应该建议将此作为 Connect 上的新功能 (connect.microsoft.com/visualstudio)。
    【解决方案4】:

    使用异步模型实现您的服务,并让一些代码监控您未完成的请求以查看它们是否花费了太长时间。

    然后,如果在请求能够以真实方式得到响应之前发生超时,则调用它们的回调。 WCF 堆栈在调用您的

    时提供此功能
    BeginFoo( fooParam1, fooParam2, AsyncCallback callback, object state)
    

    然后在相应的EndFoo() 方法中抛出或返回您的故障/超时异常或响应。

    如果真正的答案最终出现,请确保不要再次调用他们的回调。

    这需要一些时间来适应异步 wcf 编程,但是不,显然没有服务器端设置。

    此外,您应该尝试使用支持超时或可取消请求的客户端,因为您可能无法依靠服务器来为您超时请求。可能没有连接,或者服务器机器可能有其他问题。

    干杯, 克里斯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-22
      • 2016-11-07
      • 2012-11-24
      • 2012-03-25
      • 2012-03-23
      • 2010-09-18
      • 2013-01-15
      相关资源
      最近更新 更多