Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用HttpClient时出现HttpRequestException?_C#_Win Universal App_Dotnet Httpclient - Fatal编程技术网

C# 使用HttpClient时出现HttpRequestException?

C# 使用HttpClient时出现HttpRequestException?,c#,win-universal-app,dotnet-httpclient,C#,Win Universal App,Dotnet Httpclient,我有一个WebClient请求一个URL。我想在UWP应用程序中做同样的事情,我发现我必须导入Microsoft.Net.Http并使用HttpClient 所以我替换了这个(在类库中): 通过在PCL库中执行此操作: HttpClient client = new HttpClient(); string content = await client.GetStringAsync(url); 现在我得到了一个例外: System.Net.Http.HttpRequestException o

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

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

通过在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: 
System.Net.Http.HttpRequestException发生
HResult=-2147012867
Message=发送请求时出错。
Source=System.Net.Http
堆栈跟踪:
在System.Net.Http.HttpClientHandler.d_u1.MoveNext()中
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()中
在XXXX.yyy.MHDJ.ZZZZ.d_uu4.MoveNext()处
内部异常:
错误代码=-2147012867
HResult=-2147012867
Message=Le texte associéce code d'erreur est introvable。
不可能的,不可能的
Source=“”
堆栈跟踪:
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Net.Http.HttpHandlerToFilter.d_u1.MoveNext()中
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Net.Http.HttpClientHandler.d_u1.MoveNext()中
内部异常:

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

十六进制的
HRESULT
code
-2147012867
0x80072EFD
0x8007
前缀表示它实际上是一个。原始的
Win32
错误代码是
0x2EFD

告诉我们值
0x2EE0
0x2F8F
ERROR\u internetwork.*
错误代码,这听起来像是正确的错误类型。在链接到之后,我们可以将错误代码
0x2EFD
转换回十进制(
12029
),并发现它是错误
错误\u INTERNET\u无法连接

尝试连接到服务器失败

相当普通,没有太多帮助

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


更新:跟踪错误代码的含义相当繁琐,因此我。

有很多方法可以做事情,我不是说这是最好的方法,但这就是我构建方法的方式。这个例子就是我用来返回以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;
}
使用系统;
使用System.Collections.Generic;
使用System.Net.Http;
使用System.Net.Http.Header;
使用Newtonsoft.Json;
使用System.Threading.Tasks;
//IStateInfo是我的模型类接口
公共异步任务GetAllStatesAsync()
{
列表状态=新列表();
尝试
{
使用(var client=new HttpClient())
{
client.BaseAddress=新Uri(“http://YourBaseApiHere");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
string url=“查找/usstates”;
HttpResponseMessage response=wait client.GetAsync(url);
if(响应。IsSuccessStatusCode)
{
var json=await response.Content.ReadAsStringAsync();
//反序列化为此处使用的客户端类Newtonsoft JSON
var lst=JsonConvert.DeserializeObject(json);
州。添加范围(lst);
}
其他的
{
//在此处通知失败的web调用
}
}
}
捕获(例外e)
{
//通知错误
}
返回状态;
}

遇到0x80072efd问题。我花了几个小时甚至几天来解决这个问题。对我有效的解决方案是来自管理命令提示符的以下命令:


netsh-winhttp-reset-proxy

我现在添加了UserAgent,同样的错误是,我连续尝试了10次,仍然无法工作。对于权限,我只添加了“Internet(客户端)”,我不知道是否还有其他内容需要添加?如果您调用的url是一个内部域,您还需要检查专用网络功能。@J4N:使用
WebClient
,是否有相同的测试?@StephenCleary是,我粘贴的确切代码与
WebClient
(使用完全相同的URL)一起工作。此外,我还尝试了一些其他URL(类似或类似)@MarkW我只使用网址。但是我不知道如果中间有一些本地代理(比如fiddler),它会有什么反应。我尝试做完全相同的事情(使用基址,使用MediaTypeWithQualityHeaderValue,调用相同的方法(但使用我的URI),不走运,仍然是完全相同的错误,我感觉它与代码没有直接关系,但我找不到它与代码的关系。发现有人有相同的错误,但在IOT上-最终导致防火墙配置问题…我检查了,但目前我没有活动防火墙(甚至禁用了windows防火墙).而且我也没有防病毒软件,是吗
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;
}