Framework 4.8的 HttpClientHandler 有 ServerCertificateCustomValidationCallback 所以处理https请求做如下操作:
var handler = new HttpClientHandler();
var baseUri = new Uri(url);
if (baseUri.Scheme.ToLower() == "https")
{
handler.UseDefaultCredentials = true;
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };
}
var httpClient = new HttpClient(handler);
var response = await httpClient.PostAsync(url, new StringContent(postJson, Encoding.UTF8, "text/json"));
string responseJson = await response.Content.ReadAsStringAsync();
Framework 4.6.1的 HttpClientHandler 没有 ServerCertificateCustomValidationCallback 所以处理https请求做如下操作:
var handler = new WebRequestHandler();
handler.ServerCertificateValidationCallback = delegate { return true; };
// Create WebRequestHandler and set UseDefaultCredentials and AllowPipelining (for HTTP) properties
WebRequestHandler webRequestHandler = new WebRequestHandler();
webRequestHandler.UseDefaultCredentials = true;
webRequestHandler.AllowPipelining = true;
// Create an HttpClient using the WebRequestHandler
HttpClient client = new HttpClient(webRequestHandler);
// Create an HttpClient and add message handlers for the client
HttpClient client = HttpClientFactory.Create(
clientHandler,
new SampleHandler("Client A", 2),
new SampleHandler("Client B", 4),
new SampleHandler("Client C", 6));
WebRequestHandler的代码运行时会报错:The remote certificate is invalid according to the validation procedure.
参考:
HttpClient, HttpClientHandler, and WebRequestHandler Explained_weixin_30767835的博客-CSDN博客
扩展:
4.6 .NET Framework 包括一项新的安全功能,用于阻止连接的不安全密码和哈希算法。 默认情况下,通过 Api (例如 HttpClient、HttpWebRequest、FtpWebRequest、SmtpClient、4.6 SslStream等)使用 TLS/SSL 的应用程序将获得更安全的行为。
如需关闭该安全行为,只需要如此即可~请勿设置System.Net.ServicePointManager.SecurityProtocol!
private const string DisableCachingName = @"TestSwitch.LocalAppContext.DisableCaching";
private const string DontEnableSchUseStrongCryptoName = @"Switch.System.Net.DontEnableSchUseStrongCrypto";
static void Main(string[] args)
{
AppContext.SetSwitch(DisableCachingName, true);
AppContext.SetSwitch(DontEnableSchUseStrongCryptoName, true);
var handler = new HttpClientHandler();
using (var http2 = new HttpClient(handler))
{
var r = http2.GetAsync("https://*****:8888/");
r.Wait();
Console.WriteLine(r.Result);
}
}