检测客户端是否已关闭连接。

5
我有几种不同类型的客户端连接到我的Web API。其中一些客户端具有严格的内部超时策略。例如,如果我的API在3秒内没有响应,我拥有的某个客户端将会断开连接。
在某些情况下,我的API需要从第三方来源获取信息,这可能需要超过5秒钟的时间。
我正在实现一个超时撤销场景,以便客户端可以调用它,如果需要为超时而断开连接。
在ASP.NET Web API中,是否有任何方法捕获连接断开事件?

HTTP是无状态的,所以我认为这是不可能的。这取决于外部资源,但是否有办法将请求拆分成多个并异步并行运行?如果在一个请求中执行较少的重活,则可能会提高性能。这只是一次尝试。 - mdon88
很遗憾,这是不可能的。请求持续时间的平均值约为700毫秒,但在某些情况下第三方服务需要超过15秒的时间。 - Lorenzo
这就是关于客户端和你的Web API之间以及Web API在哪里根据客户端请求获取数据的“网络”问题。现在,一旦客户端触发了对API的请求,我想除非API响应客户端请求,否则没有其他停止它的选项。除非你需要对你的Web API做一些限制响应时间的操作。这完全取决于目标机器的速度和能力。 - Vijunav Vastivch
ASP.NET Web API是基于REST的,它是无状态的,没有您想要的SOAP/WCF更丰富的功能。它不是HTTP协议的工作方式,在TCP方面甚至没有连接状态,这就是为什么TCP keepalive是有争议的功能,并且默认情况下始终关闭的原因。 - Jeremy Thompson
感谢大家的贡献。正如我在问题中所写的,我们正在为API实现一个超时撤销功能,以便我们可以指示我们的客户在他们的环境中如果出现超时就调用“cancel”API。这肯定会帮助我们处理这些情况,至少在API使用文档方面。我只是猜测是否可以使用例如IsClientConnected或类似于此文章中描述的CancellationToken形式,该文章与AspNetCore相关。 - Lorenzo
1个回答

1

我尝试了一下,因为我也遇到了同样的问题,以下方法对我有效:

if (!HttpContext.Current.Response.IsClientConnected)
{
    return;
}

再次声明,这在我的情况下起作用,但我希望它对您有所帮助。

以下是微软文档: HttpResponse.IsClientConnected属性


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