有没有办法告诉WCF服务在一定时间后响应请求(有或没有中止它的处理),即使它还没有完成,比如服务器端超时策略?
答案 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
简而言之:
因此,如果服务器过载并且预计会导致更多超时,我实现了删除请求的方法。
答案 2 :(得分:0)
我不知道你为什么要这样做 - 你应该编辑你的问题来说出你想要完成的事情。
如果我必须这样做,那么我会让Web服务将请求传递给单独的Windows服务,可能通过使用WCF over MSMQ。我会对该请求超时。如果请求没有及时完成,我只会返回一个超时故障。实际请求不会受到影响。
答案 3 :(得分:0)
使用异步模型实现您的服务,并使用一些代码监控您的未完成请求,看看它们是否花了太长时间。
然后,如果在以真实方式回答请求之前发生超时,则调用其回调。 WCF堆栈在调用
时提供此功能BeginFoo( fooParam1, fooParam2, AsyncCallback callback, object state)
然后在相应的EndFoo()
方法中抛出或返回您的错误/超时异常或响应。
如果真正的答案最终出现,请务必不要再次拨回电话。
这需要一些习惯于异步wcf编程,但不,显然没有服务器端设置。
此外,您应该尝试使用支持超时或可取消请求的客户端,因为您可能无法依靠服务器为您的请求超时。可能没有连接或服务器计算机可能有其他问题。
干杯, 克里斯