我一直在使用HttpClient
通过C#进行WebApi调用。与WebClient
相比,这似乎是一种简洁而快速的方式。然而,我在进行Https
调用时遇到了问题。
如何编写下面的代码来进行Https
调用?
HttpClient httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("https://foobar.com/");
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/xml"));
var task = httpClient.PostAsXmlAsync<DeviceRequest>(
"api/SaveData", request);
http EDIT 1:上面的代码可以很好地进行调用。但是,当我将方案更改为https时,它不起作用。获取的错误如下:
基础连接已关闭:无法为SSL/TLS安全通道建立信任关系。
https EDIT 2:将方案更改为是:第一步。
如何在C#请求中提供证书和公钥/私钥。
发布于 2015-10-13 07:39:33
如果服务器仅支持更高的TLS版本,如TLS 1.2,它仍然会失败,除非您的客户端PC默认配置为使用更高的TLS版本。要解决此问题,请在代码中添加以下内容:
System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
修改您的代码示例,它将是
HttpClient httpClient = new HttpClient();
//specify to use TLS 1.2 as default connection
System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
httpClient.BaseAddress = new Uri("https://foobar.com/");
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
var task = httpClient.PostAsXmlAsync<DeviceRequest>("api/SaveData", request);
发布于 2014-03-07 21:47:07
只需在URI中指定HTTPS即可。
new Uri("https://foobar.com/");
Foobar.com将需要一个受信任的SSL证书,否则您的调用将失败并出现不受信任的错误。
编辑答案:
WebRequestHandler handler = new WebRequestHandler();
X509Certificate2 certificate = GetMyX509Certificate();
handler.ClientCertificates.Add(certificate);
HttpClient client = new HttpClient(handler);
编辑Answer2:如果您连接的服务器禁用了SSLTL1.0和1.1,并且您仍在运行.NET Framework4.5(或更低版本),则需要选择
应用程序代码以手动配置.NET以通过to 1.2进行连接(请参见Ronald Ramos to
发布于 2014-03-07 21:48:38
你的代码应该这样修改:
httpClient.BaseAddress = new Uri("https://foobar.com/");
您只需使用https:
URI方案即可。在MSDN上有一个关于安全超文本传输协议连接的有用页面here。确实是这样:
使用https: URI方案
HTTP协议定义了两个URI方案:
http :用于未加密的连接。
https :用于应加密的安全连接。此选项还使用数字证书和证书颁发机构来验证服务器是否为其声称的服务器。
此外,考虑HTTPS连接使用SSL证书。确保您的安全连接具有此证书,否则请求将失败。
编辑:
上面的代码可以很好地进行
调用。但是,当我将方案更改为https时,它不起作用,让我发布错误。
它不工作是什么意思?请求会失败吗?抛出异常?澄清你的问题。
如果请求失败,则问题应该是SSL证书。
要解决此问题,可以先使用类HttpWebRequest
,然后使用其属性ClientCertificate
。此外,您还可以找到有关如何使用证书发出here请求的有用示例。
示例如下(如之前链接的MSDN页面所示):
//You must change the path to point to your .cer file location.
X509Certificate Cert = X509Certificate.CreateFromCertFile("C:\\mycert.cer");
// Handle any certificate errors on the certificate from the server.
ServicePointManager.CertificatePolicy = new CertPolicy();
// You must change the URL to point to your Web server.
HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://YourServer/sample.asp");
Request.ClientCertificates.Add(Cert);
Request.UserAgent = "Client Cert Sample";
Request.Method = "GET";
HttpWebResponse Response = (HttpWebResponse)Request.GetResponse();
https://stackoverflow.com/questions/22251689
复制相似问题