HttpRequestException使用HttpClient时?

问题描述:

我有一个WebClient正在请求一个URL。我想在UWP应用程序中做同样的事情,并且我看到我必须导入Microsoft.Net.Http并使用HttpClient。在PCL库HttpRequestException使用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); 

通过此:

所以我换成这(那是在一个类库)

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: 

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

HRESULT代码-2147012867(十六进制)是0x80072EFD。前缀0x8007表示它实际上是HRESULT wrapper around a Win32 error code。原始的Win32错误代码是0x2EFD

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

连接到服务器失败的尝试。

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

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

更新:跟踪下来的错误代码的含义是相当繁琐的,所以我wrote an app to do it

+0

我已经添加了用户代理,现在,同样的错误,我试过10次连续和仍然无法正常工作。对于权利,我只添加了“Internet(客户端)”,我不知道是否应该添加其他内容? – J4N

+0

如果您要拨打的网址是内部网域,您还需要检查专用网络功能。 –

+0

@ J4N:与'WebClient'一起使用的测试是否一样? –

有很多方法可以做事,我并不是说这是最好的方法,但这是我构建方法的方法。这个例子就是我用来返回以JSON格式提供的美国State对象的列表。一个重要的说明......这是在通用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; 
} 
+0

我试图做同样的事情(使用基地址,使用MediaTypeWithQualityHeaderValue,调用相同的方法(但与我的URI),没有运气,仍然是完全相同的错误,我觉得它不直接与代码,但我找不到与它相关的东西 – J4N

+0

发现有人有相同的错误,但在物联网 - 最终成为防火墙配置问题... http://*.com/questions/32489813/httpclient-in-通用windows-app-running-on-windows-10-iot-core-throws- –

+0

我已经检查过,但目前我没有活动的防火墙(即使是一个窗口被禁用)也没有杀毒软件,我也只是试图启动Visual Studio作为管理员,没有运气:( – J4N

遇到0x80072efd问题。如果没有数天解决,花费我几个小时。为我工作的解决方案是从管理员命令提示符下键入以下命令:

netsh winhttp reset proxy

+0

全牛。谢谢! –