我有一个调用我的API的.Net 4.5.2 WebApp。当我将我的Web应用程序指向我的API的LocalHost版本时,它会获取数据,然后回来就好了。我发布了该API,并确认API与PostMan一起正常运行。 然后我运行完全相同的WebApp代码,只将URI从localhost更改为live api,我得到一个包含以下内容的多重异常错误:
这是我的主叫代码
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请求之间的区别是什么,当另一个不关闭时,关闭请求。
答案 0 :(得分:0)
您似乎正在安全 http环境(https)上托管该应用程序。您是否在托管Web API的服务器上使用SSL证书?如果没有,它可能会抛出与证书相关的异常。
只需在调用GetAsync之前添加以下行,这将忽略SSL错误。
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
仅建议在内部网环境或其他无法伪造服务器身份的封闭网络中使用。
答案 1 :(得分:0)
在我的API调用之前添加以下行修复了该问题,但我很想听到有关此行的功能的解释,以及这可能会在我的Web应用中使用它带来的任何安全风险。
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
支持此answer!