WCF服务器端超时

时间:2009-07-19 08:55:24

标签: wcf web-services timeout

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

4 个答案:

答案 0 :(得分:2)

我想你可以通过在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;
}

答案 1 :(得分:1)

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

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

简而言之:

  1. WCF服务器超时配置不起作用
  2. 您可以像其他人所说的那样实施超时
  3. 这样的超时并不能保证对客户端的及时响应,因为在超时输入代码之前,请求可能会排队很长时间。
  4. 因此,如果服务器过载并且预计会导致更多超时,我实现了删除请求的方法。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

然后,如果在以真实方式回答请求之前发生超时,则调用其回调。 WCF堆栈在调用

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

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

如果真正的答案最终出现,请务必不要再次拨回电话。

这需要一些习惯于异步wcf编程,但不,显然没有服务器端设置。

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

干杯, 克里斯