【问题标题】:PostAsync timeout / exception behaviourPostAsync 超时/异常行为
【发布时间】:2018-04-25 08:32:05
【问题描述】:

关于 HttpClient 的 PostAsync 方法的文档有点……偏低。

我想知道它的行为: 如果超时或被调用的网站抛出异常,它是否会带来任何异常?如果不是,在这些情况下会发生什么?

举例

using (HttpClient Client = new HttpClient())
{
     var result = Client.PostAsync(url, content).Result;
}

调用的站点有时会抛出异常或在高流量的情况下超时。我不确定结果是什么。我会得到异常,“无限循环”(因此不会发生超时),还是如果抛出异常或发生超时,结果只是空的?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    首先,请避免使用Result。这是一个阻塞调用。您应该使用 async/await 关键字。将相应的方法标记为 async 并在方法调用前加上 await:

    var result = await Client.PostAsync(url, content);
    

    关于您的问题,此调用的结果是Task<HttpResponseMessage>。 可以在此处TaskStatus Enumeration 找到任务的状态。当然,这个调用可能会失败。因此,您应该捕获任何可能引发的异常。

    【讨论】:

    • 所以即使是同步的我也会超时?如果我是正确的而不是网络服务本身,阻塞本身仅适用于客户端? (客户端的构造使其在任何情况下都需要等待响应,因此我看不到异步调用的巨大优势)
    • @Thomas 对 Web 服务的任何调用都可能会超时,无论此调用是同步进行还是异步进行。阻塞与您的应用程序有关。您调用的 Web 服务只收到一个请求,并且必须对其作出响应。在这个级别没有任何阻塞概念。关于异步编程的优点,请看stackoverflow.com/questions/28841345/…,有很好的解释。
    • 好极了。不确定,因为文档没有说明 postasync 调用的反应。通常你是对的, async / await 绝对是要走的路(+1也为此)。在我的用例中,我只想在通话结束时(一种或另一种方式)继续在应用程序中,所以在客户端阻塞对我来说是可以的。 tnx 将尽快接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 2022-01-18
    • 1970-01-01
    • 2015-01-28
    • 2015-11-29
    • 2013-06-02
    相关资源
    最近更新 更多