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告诉我们,值0x2EE0
到0x2F8F
是ERROR_INTERNET_*
错误代码,这听起来像是正确的错误类型。下面的链接Win32
ERROR_INTERNET_*
error code listing后,我们可以把我们的错误代码0x2EFD
回十进制(12029
),并发现它是错误ERROR_INTERNET_CANNOT_CONNECT
:
连接到服务器失败的尝试。
相当通用,并没有太大的帮助。
我建议再次尝试连接,确保您的应用程序具有适当的权限,并且设备实际上具有正常的Internet连接。如果这不起作用,请尝试添加UserAgent
标题;您的设备上的网络堆栈可能会坚持使用它。
更新:跟踪下来的错误代码的含义是相当繁琐的,所以我wrote an app to do it。
有很多方法可以做事,我并不是说这是最好的方法,但这是我构建方法的方法。这个例子就是我用来返回以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;
}
我试图做同样的事情(使用基地址,使用MediaTypeWithQualityHeaderValue,调用相同的方法(但与我的URI),没有运气,仍然是完全相同的错误,我觉得它不直接与代码,但我找不到与它相关的东西 – J4N
发现有人有相同的错误,但在物联网 - 最终成为防火墙配置问题... http://*.com/questions/32489813/httpclient-in-通用windows-app-running-on-windows-10-iot-core-throws- –
我已经检查过,但目前我没有活动的防火墙(即使是一个窗口被禁用)也没有杀毒软件,我也只是试图启动Visual Studio作为管理员,没有运气:( – J4N
遇到0x80072efd问题。如果没有数天解决,花费我几个小时。为我工作的解决方案是从管理员命令提示符下键入以下命令:
netsh winhttp reset proxy
全牛。谢谢! –
我已经添加了用户代理,现在,同样的错误,我试过10次连续和仍然无法正常工作。对于权利,我只添加了“Internet(客户端)”,我不知道是否应该添加其他内容? – J4N
如果您要拨打的网址是内部网域,您还需要检查专用网络功能。 –
@ J4N:与'WebClient'一起使用的测试是否一样? –