WCF服务器端超时
有没有一种方法可以告诉WCF服务在一段时间后响应请求(无论是否中止其处理),即使请求尚未完成,比如服务器端超时策略?我想您可以通过在WCF操作启动后立即启动一个新线程来做到这一点。然后,实际工作发生在新线程上,原始WCF请求线程使用具有特定超时的thread.Join()等待。如果发生超时,可以使用thread.Abort()取消工作线程 大概是这样的:WCF服务器端超时,wcf,web-services,timeout,Wcf,Web Services,Timeout,有没有一种方法可以告诉WCF服务在一段时间后响应请求(无论是否中止其处理),即使请求尚未完成,比如服务器端超时策略?我想您可以通过在WCF操作启动后立即启动一个新线程来做到这一点。然后,实际工作发生在新线程上,原始WCF请求线程使用具有特定超时的thread.Join()等待。如果发生超时,可以使用thread.Abort()取消工作线程 大概是这样的: public string GetData(int value) { string result = ""; var work
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;
}
我不知道你为什么要这样做——你可能应该编辑你的问题,说出你想要实现的目标
如果我必须这样做,那么我会让web服务将请求传递给一个单独的Windows服务,可能是通过在MSMQ上使用WCF。我会有一个超时的请求。如果请求没有及时完成,我只会返回一个超时错误。实际的请求不会受到影响。使用异步模型实现您的服务,并让一些代码监视未完成的请求,以查看它们是否花费了太长时间 然后,如果在请求得到真正响应之前发生超时,则调用他们的回调。WCF堆栈在调用
BeginFoo( fooParam1, fooParam2, AsyncCallback callback, object state)
然后在相应的EndFoo()
方法中抛出或返回错误/超时异常或响应
如果最终得到了真正的答案,一定不要再打电话给他们
要习惯异步wcf编程需要一些时间,但不,显然没有服务器端设置
此外,您应该尝试使用支持超时或可取消请求的客户端,因为您可能无法依靠服务器为您超时请求。可能没有连接,或者服务器计算机可能存在其他问题
干杯,
克里斯我解决了同样的问题,并发表了一篇博文: 简言之:
因此,我实现了一种方法,在服务器过载并可能导致更多超时时丢弃请求。但如果服务器未完成请求处理,您需要什么样的响应?只是FaultContract中的一个异常。如果它未及时完成,你会得到一个TimeoutException-这还不够好吗?@marc_s:我猜你说的是客户端超时,我有一个非WCF客户端,无法设置超时。谢谢,但我不想使用线程。在我的工作线程上中止,太冒险了。我正在寻找WCF的一部分。AFAIK没有标准的WCF选项来实现这一点。当一个请求需要很长时间,但服务器没有意识到这一点时,可以选择让客户端超时,并将继续处理该请求,并将返回结果,即使没有人在侦听。顺便说一句,.NET 4.0任务模型使服务器上的踩踏变得更好。最终使用了这样一个手动计时器,只是没有中止工作进程。这正是我希望WCF为我做的,只是没有额外进程的开销。我不相信它能做到这一点。我以前从未听过这个要求。也许您应该建议将其作为Connect()上的新功能。