【问题标题】:HttpRequestException when using HttpClient?使用 HttpClient 时出现 HttpRequestException?
【发布时间】:2016-08-05 19:07:14
【问题描述】:

我有一个 WebClient 正在请求一个 URL。我想在 UWP 应用程序中做同样的事情,我看到我必须导入 Microsoft.Net.Http 并使用 HttpClient

所以我替换了这个(在类库中):

WebClient client = new WebClient();
client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
string content = client.DownloadString(url);

通过这个在 PCL 库中:

HttpClient client = new HttpClient();
string content = await client.GetStringAsync(url);

现在我得到了这个例外:

System.Net.Http.HttpRequestException occurred
  HResult=-2147012867
  Message=An error occurred while sending the request.
  Source=System.Net.Http
  StackTrace:
       at System.Net.Http.HttpClientHandler.<SendAsync>d__1.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
       at XXXX.YYYY.MHDJ.ZZZZ.<ParsePage>d__4.MoveNext()
  InnerException: 
       ErrorCode=-2147012867
       HResult=-2147012867
       Message=Le texte associé à ce code d’erreur est introuvable.

Impossible d'établir une connexion avec le serveur

       Source=""
       StackTrace:
            at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
            at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
            at System.Net.Http.HttpHandlerToFilter.<SendAsync>d__1.MoveNext()
         --- End of stack trace from previous location where exception was thrown ---
            at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
            at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
            at System.Net.Http.HttpClientHandler.<SendAsync>d__1.MoveNext()
       InnerException: 

我认为问题不在于标头,那是什么?

【问题讨论】:

  • 我遇到了同样的错误,因为 Charles Proxy 已打开。关闭应用解决了问题

标签: c# win-universal-app dotnet-httpclient


【解决方案1】:

十六进制的HRESULT 代码-21470128670x80072EFD0x8007 前缀意味着它实际上是一个HRESULT wrapper around a Win32 error code。原来的Win32错误码是0x2EFD

Win32 error code list 告诉我们值0x2EE00x2F8FERROR_INTERNET_* 错误代码,这听起来像是正确的错误类型。通过Win32 ERROR_INTERNET_* error code listing的链接,我们可以将错误代码0x2EFD转换回十进制(12029)并发现它是错误ERROR_INTERNET_CANNOT_CONNECT

尝试连接服务器失败。

相当通用,并没有太大帮助。

我建议再次尝试连接,确保您的应用程序具有适当的权限并且设备实际上具有有效的 Internet 连接。如果这不起作用,请尝试重新添加 UserAgent 标头;您设备上的网络堆栈可能坚持使用它。

更新:追查错误码含义比较繁琐,所以我wrote an app to do it

【讨论】:

  • 我现在添加了UserAgent,同样的错误,我连续试了10次还是不行。权限,我只加了“Internet(客户端)”,不知道还有什么要加的?
  • 如果你调用的url是内部域,你还需要检查Private Networks能力。
  • @J4N:与WebClient 一起使用的确切测试是否相同?
  • @StephenCleary 是的,我粘贴的确切代码与WebClient(使用完全相同的 URL)一起工作。我还尝试了其他一些 URL(例如 google.com 或类似的)
  • @MarkW 我只使用网址。但我不知道如果中间有一些本地代理(如提琴手)它会如何反应
【解决方案2】:

遇到 0x80072efd 问题。花了我几个小时,如果不是几天来解决。对我有用的解决方案是来自管理员命令提示符的以下命令:

netsh winhttp reset proxy

【讨论】:

    【解决方案3】:

    有很多方法可以做事,我并不是说这是最好的方法,但这就是我构建方法的方式。此示例用于返回以 JSON 格式提供的美国州对象列表。一个重要的注意事项...这是在通用 Windows 类库中,而不是 PCL...但我不相信它使用了 PCL 无法访问的任何内容。

    using System;
    using System.Collections.Generic;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using Newtonsoft.Json;
    using System.Threading.Tasks;
    
    //IStateInfo is my model class interface
    public async Task<IList<IStateInfo>> GetAllStatesAsync()
    {
        List<IStateInfo> states = new List<IStateInfo>();
        try
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://YourBaseApiHere");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                string url = "lookup/usstates";
                HttpResponseMessage response = await client.GetAsync(url);
                if (response.IsSuccessStatusCode)
                {
                    var json = await response.Content.ReadAsStringAsync();
                    //deserialize into client class Newtonsoft JSON used here
                    var lst = JsonConvert.DeserializeObject<List<StateInfo>>(json);
                    states.AddRange(lst);
                }
                else
                {
                    //notify of failed web call here
                }
            }
        }
        catch (Exception e)
        {
            //notify of error
        }
        return states;
    }
    

    【讨论】:

    • 我尝试做完全相同的事情(使用基地址,使用 MediaTypeWithQualityHeaderValue,调用相同的方法(但使用我的 URI),不走运,仍然是完全相同的错误,我感觉它是与代码没有直接关系,但我找不到与它相关的内容。
    • 发现有人有同样的错误,但在物联网上 - 最终成为防火墙配置问题...stackoverflow.com/questions/32489813/…
    • 我已经检查过了,但目前我没有活动的防火墙(即使是 Windows 也被禁用)。而且我也没有杀毒软件,禁用了Windows Defender。我也只是尝试以管理员身份启动 Visual Studio,但运气不好:(
    • 事实上,在我尝试了所有这些之后(更改正确,以管理员身份启动,更新我的 windows,更新所有 nuget 包)它没有工作,现在重新启动后,它似乎工作了.. .. 道德,我应该更频繁地重启:/ 对不起,伙计们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 2014-01-09
    • 2017-12-07
    • 2017-10-02
    相关资源
    最近更新 更多