HttpClient.GetAsync适用于LocalHost API,但不适用于Live API

时间:2017-04-13 21:37:45

标签: asp.net .net ssl-certificate

我有一个调用我的API的.Net 4.5.2 WebApp。当我将我的Web应用程序指向我的API的LocalHost版本时,它会获取数据,然后回来就好了。我发布了该API,并确认API与PostMan一起正常运行。 然后我运行完全相同的WebApp代码,只将URI从localhost更改为live api,我得到一个包含以下内容的多重异常错误:

  1. 远程主机强行关闭现有连接
  2. 无法从传输连接读取数据:远程主机强行关闭现有连接。
  3. 基础连接已关闭:发送时发生意外错误。
  4. 发送请求时出错。
  5. 这是我的主叫代码

     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 Core应用程序,我的原始代码可以完美地调用我的实时API。我的原始代码也可以在.NET 4.5.2中使用不同的“https”API。

    编辑2: 所以这就是我现在所处的位置,我已经从VS 2015创建了两个通用应用程序,一个是.NET Core Web App,另一个是.NET Framework Web App。我在两个应用程序中使用了完全相同的上述代码来调用API。在这两个应用程序中,我可以调用我在网上找到的通用“https”api(jsonplaceholder)。我也可以从“http”调用我的应用程序的localhost版本。在应用程序的.NET Core版本中,我可以调用我的“https”实时API并获取我正在寻找的结果。在.NET Framework应用程序中,我仍然会遇到相同的错误。

    我无法弄清楚我的Core和Framework请求之间的区别是什么,当另一个不关闭时,关闭请求。

2 个答案:

答案 0 :(得分:0)

您似乎正在安全 http环境(https)上托管该应用程序。您是否在托管Web API的服务器上使用SSL证书?如果没有,它可能会抛出与证书相关的异常。

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

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

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

C# Ignore certificate errors?

答案 1 :(得分:0)

在我的API调用之前添加以下行修复了该问题,但我很想听到有关此行的功能的解释,以及这可能会在我的Web应用中使用它带来的任何安全风险。

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

支持此answer