Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF服务器端超时_Wcf_Web Services_Timeout - Fatal编程技术网

WCF服务器端超时

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

有没有一种方法可以告诉WCF服务在一段时间后响应请求(无论是否中止其处理),即使请求尚未完成,比如服务器端超时策略?

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

我不知道你为什么要这样做——你可能应该编辑你的问题,说出你想要实现的目标


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

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

然后,如果在请求得到真正响应之前发生超时,则调用他们的回调。WCF堆栈在调用

BeginFoo( fooParam1, fooParam2, AsyncCallback callback, object state)
然后在相应的
EndFoo()
方法中抛出或返回错误/超时异常或响应

如果最终得到了真正的答案,一定不要再打电话给他们

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

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

干杯,
克里斯

我解决了同样的问题,并发表了一篇博文:

简言之:

  • WCF服务器超时配置不工作
  • 您可以像其他人所说的那样实现超时
  • 这样的超时不能保证及时响应客户机,因为在输入带有超时的代码之前,请求可能会排队很长时间
    因此,我实现了一种方法,在服务器过载并可能导致更多超时时丢弃请求。

    但如果服务器未完成请求处理,您需要什么样的响应?只是FaultContract中的一个异常。如果它未及时完成,你会得到一个TimeoutException-这还不够好吗?@marc_s:我猜你说的是客户端超时,我有一个非WCF客户端,无法设置超时。谢谢,但我不想使用线程。在我的工作线程上中止,太冒险了。我正在寻找WCF的一部分。AFAIK没有标准的WCF选项来实现这一点。当一个请求需要很长时间,但服务器没有意识到这一点时,可以选择让客户端超时,并将继续处理该请求,并将返回结果,即使没有人在侦听。顺便说一句,.NET 4.0任务模型使服务器上的踩踏变得更好。最终使用了这样一个手动计时器,只是没有中止工作进程。这正是我希望WCF为我做的,只是没有额外进程的开销。我不相信它能做到这一点。我以前从未听过这个要求。也许您应该建议将其作为Connect()上的新功能。