【问题标题】:How to make PostAsync respond if API is down如果 API 关闭,如何使 PostAsync 响应
【发布时间】:2018-07-18 03:40:11
【问题描述】:

我正在使用这些命令调用 API:

byte[] messageBytes = System.Text.Encoding.UTF8.GetBytes(message);

var content = new ByteArrayContent(messageBytes);

content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");

HttpResponseMessage response = client.PostAsync(ApiUrl, content).Result;

但是,代码在 PostAsync 行停止执行。我在下一行设置了一个断点,但从未到达。它不会立即抛出错误,但几分钟后它会抛出如下错误:

System.Net.Sockets.SocketException:连接尝试失败,因为连接方在一段时间后没有正确响应,或者连接失败,因为连接的主机没有响应。

我认为这意味着 API 已关闭。我该怎么做才能让PostAsync 立即吐出错误,即使 API 已关闭,以便我可以处理错误并通知用户?

谢谢。

【问题讨论】:

  • 某事DoItAsync 要求函数声明为async Task<...> Something 并且调用看起来像response = await DoItAsync(...)
  • 您可以减少请求的超时时间,但是如果您将其设置得太低,即使 API 可用,也可能导致请求失败
  • 嗨@Windhoek,如果我在下面的回答对您有帮助,请务必投票并将其标记为正确答案。这可以帮助我,也可以帮助其他来到这里的人找到相同的答案。谢谢!
  • @pcdev 谢谢我前段时间投了赞成票,但也只是将其标记为答案。预检查方法对我有用。

标签: c# asp.net asp.net-web-api asp.net-web-api2


【解决方案1】:

一般来说,您要问的是“我如何检查 API 是否可用?”,答案取决于您想要获得多低的级别,以及您希望针对每个不可用级别执行什么操作:

  1. 是否有互联网连接?是否值得先在本地进行探索(因为检查起来相对较快)?
  2. 服务器地址是否正确?如果它是错误的,那么你等待多长时间都没关系。用户可以配置吗?
  3. 地址是否正确但服务器无法或不愿响应?然后怎样呢?

如果您愿意将它们全部集中到一个“无法在合理的时间内联系服务器”的存储桶中,有几种方法:

减少超时(小心)

在您提供的情况下,听起来您的请求只是超时了:地址或端口错误,服务器负载过大,无法及时响应,您正试图联系非-使用 SSL 的 SSL 端点,反之亦然,等等。在任何这些情况下,您无法知道请求是否超时,直到它实际超时。您可以做的一件事是减少HttpClient request timeout。当心:太低会导致用户连接缓慢而超时,这是一个比您遇到的问题更严重的问题。

预检

您可以在每次调用之前、定期或在客户端初始化早期的某个时间点快速探测 API 以查看它是否响应。这可以在构建 UI 时将其拆分为异步或后台任务等。这使您有更多时间等待响应,并且如果 API 响应缓慢,您可以通知您的用户这一点作为额外的奖励所以他们知道不要期望他们的点击会立即得到响应。这将改善用户体验。如果预检查失败,您可以显示错误并建议用户检查连接、检查服务器地址(如果可配置)、重试等。

使用 CancellationToken

您可以传递带有适当超时设置的CancellationToken into PostAsync,这也允许您让用户在他们愿意时取消请求。阅读CancellationToken了解更多信息。

编辑:正如 Alex 指出的那样,这行通常不是您处理异步任务的方式:

HttpResponseMessage response = client.PostAsync(ApiUrl, content).Result;

改为:

HttpResponseMessage response = await client.PostAsync(ApiUrl, content);

当然,调用方法也需要标记为异步,等等(“它是异步的,all the way up”),但这是一个好事 - 这意味着你的代码在等待服务器响应时不会阻塞线程。 阅读here 以获得一些好的材料。

希望有帮助

【讨论】:

    猜你喜欢
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2010-11-01
    相关资源
    最近更新 更多