【问题标题】:await HttpClient.SendAsync not throwing exception when expected等待 HttpClient.SendAsync 未在预期时抛出异常
【发布时间】:2015-01-13 13:15:03
【问题描述】:

我有一个包含如下代码的 Windows Phone 8 应用程序:

using (var client = new HttpClient())
{
    var httpRequest = new HttpRequestMessage(method, uri);
    try
    {
        var response = client.SendAsync(httpRequest);
        var httpResponse = await response;
        if (httpResponse.IsSuccessStatusCode)
        {
            var result = await httpResponse.Content.ReadAsStringAsync();
            return result;
        }
        else
        {
            HandleError(httpResponse);
            return null;
        }
    }
    catch (Exception ex)
    {

        throw;
    }
}

如果客户端成功连接到服务器,我将得到预期的结果,包括所有适当的 HTTP 状态代码和原因短语。

如果客户端无法联系服务器(例如 URL 中的域/IP/端口不正确),等待的任务会在延迟一段时间后完成,并显示 404 状态和无原因短语。该任务永远不会引发异常。任务(代码 sn-p 中的响应变量)的状态为“运行到完成”。结果没有任何迹象表明实际问题 - 无论是网络故障、服务器无法访问等。

在 URL 指向不存在或无法访问的服务器、套接字连接被拒绝等情况下,如何捕获更有意义的错误? SendAsync 不应该为这种情况抛出特定的异常吗?

FWIW,客户端代码使用 VS 2013 更新 3 内置到 PCL 库中,并在 Windows Phone 模拟器中运行,使用来自 NuGet 的 System.Net.Http 2.2.28

【问题讨论】:

  • CreateHttpRequest 是做什么的?也许它正在创建一个合法地获得 404 而不是其他预期类型的​​错误的请求。你有示例方法、uri 等吗?
  • 如果SendAsync 失败,得到 404 是没有意义的。这是您的实际代码吗?
  • 从我的实际代码中简化;我简化的只是构建 HttpRequestMessage 的代码 - 添加内容和标题
  • 我认为您必须在响应上调用 EnsureSuccessStatusCode 才能引发异常。 API 并未表明 404 之类的响应会以其他方式抛出。
  • @CoryNelson 我明白了。我读得太快了,所以标题有点误导。

标签: c# windows-phone-8 portable-class-library


【解决方案1】:

Windows Phone 的 .NET HttpClient 实现不同于 Desktop 的实现(wininet 与自定义堆栈)。如果存在语义差异,这是您需要注意的不兼容性之一。

在我的简单测试中,我确实在手机模拟器上得到了“未找到”的ReasonPhrase。您还可以看到 Headers 集合是空的,而如果找到了服务器并且实际上返回了一个真正的 404,那么就会有标题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    相关资源
    最近更新 更多