2017-04-13 72 views
0

我有一个.Net 4.5.2 WebApp调用我的API。当我将我的web应用程序指向我的API的LocalHost版本时,它获取数据,并返回正常。我发布了该API,并确认该API与PostMan正常工作。 后来我跑完全相同的Web应用程序代码,从本地主机只改变URI住API,我也得到由以下的倍数异常错误:HttpClient.GetAsync适用于LocalHost API,但不适用于Live API

  1. 一个现有的连接被强行关闭远程主机
  2. 无法从传输连接读取数据:现有连接被远程主机强制关闭。
  3. 底层连接已关闭:发送时发生意外错误。
  4. 发送请求时发生错误。

这里是我的调用代码

using (HttpClient client = new HttpClient()) 
{ 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
    client.DefaultRequestHeaders.Add("user", serializedUser); 
    response = null; 
    try 
    { 
      //Uri uri = new Uri("https://jsonplaceholder.typicode.com/posts/1");//https works 
      Uri uri = new Uri("https://api.acme.com/values/test"); 
      //Uri uri = new Uri("http://localhost/5000/values/test"); //http localhost works 
      response = client.GetAsync(uri).Result; 
     } 
     catch (Exception e) 
     { 
      string er = e.Message; 
     } 
} 

编辑1:我创建了一个.NET核心应用从无到有,和我原来的代码工作完美地叫我的生活API。我的原始代码也可以在.NET 4.5.2中调用不同的“https”API。

编辑2: 所以这是我在哪里,现在,我已经从2015年VS创建两个通用的应用程序,一个是.NET的核心Web应用程序,另一个是.NET框架Web应用程序。我已经在两个应用程序中使用上述代码完全相同来调用API。在这两个应用程序中,我都可以调用我在网上找到的通用“https”api(jsonplaceholder)。我也可以在两个“http”处调用我的应用程序的本地主机版本。在应用程序的.NET Core版本中,我可以调用我的“https”实时API并获得我正在查找的结果。在.NET Framework应用程序中,我仍然遇到相同的错误。

我不明白我的核心和框架请求之间有什么区别,当另一个没有时关闭。

+0

不是我的区域,但我怀疑它与你从http更改为https有关。看看这篇文章是否有帮助:[使用HttpClient进行Https调用](http://stackoverflow.com/questions/22251689/make-https-call-using-httpclient)。 – TnTinMn

+0

你永远不应该发布代码的截图,你应该把代码放在你的问题中,然后在网站的编辑器中使用“{}”进行格式化。这样可以更好地搜索未来的访问者。 –

+0

@ScottChamberlain修复它。 –

回答

0

看来你是托管安全 HTTP环境(https)的应用程序。您在托管Web API的服务器上使用SSL证书吗?如果不是,它可能会抛出证书相关的异常。

只需在调用GetAsync之前添加以下行,这将忽略SSL错误。

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

这仅建议在Intranet环境或其他无法伪造服务器身份的封闭网络中使用。

C# Ignore certificate errors?

+0

此修补程序对我无效,我在您的帖子中尝试了该修复程序,并从您添加的链接中尝试了servicepointmanager解决方案。没有任何区别。 –

0

添加以下行之前,我的API调用固定的问题,但我很乐意听到的这行做了解释,任何安全隐患,这可能强加在我的web应用程序使用它。

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; 

道具到此answer

相关问题