首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用HttpClient进行Https调用

使用HttpClient进行Https调用
EN

Stack Overflow用户
提问于 2014-03-07 21:40:13
回答 13查看 335.5K关注 0票数 178

我一直在使用HttpClient通过C#进行WebApi调用。与WebClient相比,这似乎是一种简洁而快速的方式。然而,我在进行Https调用时遇到了问题。

如何编写下面的代码来进行Https调用?

代码语言:javascript
复制
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#请求中提供证书和公钥/私钥。

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2015-10-13 07:39:33

如果服务器仅支持更高的TLS版本,如TLS 1.2,它仍然会失败,除非您的客户端PC默认配置为使用更高的TLS版本。要解决此问题,请在代码中添加以下内容:

代码语言:javascript
复制
System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

修改您的代码示例,它将是

代码语言:javascript
复制
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);
票数 255
EN

Stack Overflow用户

发布于 2014-03-07 21:47:07

只需在URI中指定HTTPS即可。

代码语言:javascript
复制
new Uri("https://foobar.com/");

Foobar.com将需要一个受信任的SSL证书,否则您的调用将失败并出现不受信任的错误。

编辑答案:

代码语言:javascript
复制
WebRequestHandler handler = new WebRequestHandler();
X509Certificate2 certificate = GetMyX509Certificate();
handler.ClientCertificates.Add(certificate);
HttpClient client = new HttpClient(handler);

编辑Answer2:如果您连接的服务器禁用了SSLTL1.0和1.1,并且您仍在运行.NET Framework4.5(或更低版本),则需要选择

  1. Upgrade to .Net 4.6+ to注册表更改以指示4.5通过to 1.2进行连接(请参阅:salesforce writeup以了解要更改的compat和密钥或签出IISCrypto请参阅Ronald Ramos answer)

应用程序代码以手动配置.NET以通过to 1.2进行连接(请参见Ronald Ramos to

票数 131
EN

Stack Overflow用户

发布于 2014-03-07 21:48:38

你的代码应该这样修改:

代码语言:javascript
复制
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页面所示):

代码语言:javascript
复制
//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();
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22251689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档