WCF服务器端超时

3
有没有一种方式可以告诉WCF服务在一定时间内做出响应(有或没有中止处理),即使它还没有完成,类似于服务器端的超时策略?

但如果它无法完成处理请求,您想要什么类型的响应? - Ahmed
只是FaultContract的一部分的异常。 - Meidan Alon
如果它没有及时完成,你将会得到一个TimeoutException - 这不够好吗? - marc_s
1
@marc_s:我猜你是在谈论客户端超时问题,我有一个非WCF客户端,无法设置超时时间。 - Meidan Alon
4个回答

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;
}

谢谢,但我不想在我的工作线程上使用Thread.Abort,这太冒险了。我正在寻找WCF的一些相关内容。 - Meidan Alon
据我所知,目前没有标准的 WCF 选项可以实现这一点。虽然可以选择当请求时间过长时使客户端超时,但服务器不会意识到这一点,仍将继续处理请求,即使没有人在监听也会返回结果。顺便提一句,.NET 4.0 中的任务模型使得服务器上的线程处理更加优雅。 - Maurice
最终使用了手动计时器,只是没有中止工作进程。 - Meidan Alon

1

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

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

简而言之:
  1. WCF 服务器超时配置无效
  2. 你可以像其他人建议的那样实现超时
  3. 这样的超时并不能保证及时响应客户端,因为请求可能会在进入带有超时的代码之前排队等待很长时间。

因此,我实现了一种方法,如果服务器过载且预计会导致更多超时,则放弃请求。


0

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

然后,如果在真正的方式下无法回答请求之前发生超时,则调用它们的回调函数。当WCF调用您的时候,WCF堆栈会提供此功能。

BeginFoo( fooParam1, fooParam2, AsyncCallback callback, object state)

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

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

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

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

祝好, Chris


0

我不知道你为什么想要这样做 - 你应该编辑你的问题,说明你想要实现什么。

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


这正是我希望WCF为我所做的,只是没有额外进程的开销。 - Meidan Alon
我不相信它会这样做。我以前从未听说过这个请求。也许你应该在Connect(http://connect.microsoft.com/visualstudio/)上建议这作为新功能。 - John Saunders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接