C# HttpClient、HTTP/2和客户端证书.pfx、.p12
如何在.Net Core>=1.0中重新编写这段c#代码 我读到HttpClient不支持C# HttpClient、HTTP/2和客户端证书.pfx、.p12,c#,asp.net,.net-core,asp.net-core-1.0,asp.net-core-webapi,C#,Asp.net,.net Core,Asp.net Core 1.0,Asp.net Core Webapi,如何在.Net Core>=1.0中重新编写这段c#代码 我读到HttpClient不支持 .Net Framework 4.5版本 解决方案:-.Net核心版本 虽然不得不将证书从.p12更改为.pfx(私钥+SSL证书),但最终还是成功地让它工作了。它不适用于。p12 private FormUrlEncodedContent GetLoginBodyAsContent(string username, string password) { var po
.Net Framework 4.5版本
解决方案:-.Net核心版本 虽然不得不将证书从.p12更改为.pfx(私钥+SSL证书),但最终还是成功地让它工作了。它不适用于。p12
private FormUrlEncodedContent GetLoginBodyAsContent(string username, string password)
{
var postData = new List<KeyValuePair<string, string>>();
postData.Add(new KeyValuePair<string, string>("username", username));
postData.Add(new KeyValuePair<string, string>("password", password));
return new FormUrlEncodedContent(postData);
}
private async Task<LoginResponse> Login(string username, string password, string certFilename)
{
var clientHandler = GetClientHandler();
var handler = AddCert(clientHandler, certFilename);
var client = InitHttpClientInstance(handler, this.AppKey);
var content = GetLoginBodyAsContent(username, password);
var result = await client.PostAsync("/api/certlogin", content);
result.EnsureSuccessStatusCode();
var jsonSerialiser = new DataContractJsonSerializer(typeof(LoginResponse));
var stream = new MemoryStream(await result.Content.ReadAsByteArrayAsync());
var response = (LoginResponse)jsonSerialiser.ReadObject(stream);
return response;
}
private HttpClientHandler AddCert(HttpClientHandler clientHandler, string certFilename)
{
var certPfx = new X509Certificate2(certFilename);
clientHandler.SslProtocols = SslProtocols.Tls12;
clientHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
clientHandler.ClientCertificates.Add(certPfx);
clientHandler.ServerCertificateCustomValidationCallback +=
(HttpRequestMessage req, X509Certificate2 cert2, X509Chain chain, SslPolicyErrors err) => { return true; };
return clientHandler;
}
private HttpClient InitHttpClientInstance(HttpMessageHandler clientHandler, string appKey, string baseUrl = DefaultAuthServiceUrl)
{
var client = new HttpClient(clientHandler);
client.BaseAddress = new Uri(baseUrl);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("X-Application", appKey);
client.DefaultRequestHeaders.ExpectContinue = true;
client.DefaultRequestHeaders.Add("Connection", "Close");
return client;
}
private HttpClientHandler GetClientHandler()
{
var clientHandler = new HttpClientHandler();
return clientHandler;
}
private FormUrlEncodedContent GetLoginBodyContent(字符串用户名、字符串密码)
{
var postData=新列表();
添加(新的KeyValuePair(“用户名”,username));
添加(新的KeyValuePair(“密码”,password));
返回新的FormUrlEncodedContent(postData);
}
专用异步任务登录(字符串用户名、字符串密码、字符串文件名)
{
var clientHandler=GetClientHandler();
var handler=AddCert(clientHandler,certFilename);
var client=InitHttpClientInstance(处理程序,this.AppKey);
var content=getLoginBodyContent(用户名、密码);
var result=wait client.PostAsync(“/api/certlogin”,content);
result.EnsureSuccessStatusCode();
var jsonSerialiser=新的数据契约jsonserializer(typeof(LoginResponse));
var stream=newmemoryStream(wait result.Content.ReadAsByteArrayAsync());
var响应=(LoginResponse)jsonSerialiser.ReadObject(流);
返回响应;
}
私有HttpClientHandler-AddCert(HttpClientHandler-clientHandler,字符串certFilename)
{
var certPfx=新的X509Certificate2(certFilename);
clientHandler.SslProtocols=SslProtocols.Tls12;
clientHandler.ClientCertificateOptions=ClientCertificateOptions.Manual;
clientHandler.ClientCertificates.Add(certPfx);
clientHandler.ServerCertificateCustomValidationCallback+=
(HttpRequestMessage-req,X509Certificate2-cert2,X509Chain-chain,SslPolicyErrors-err)=>{return true;};
回程钳;
}
私有HttpClient InitHttpClientInstance(HttpMessageHandler-clientHandler,string-appKey,string-baseUrl=DefaultAuthServiceUrl)
{
var客户端=新的HttpClient(clientHandler);
client.BaseAddress=新Uri(baseUrl);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
client.DefaultRequestHeaders.Add(“X-Application”,appKey);
client.DefaultRequestHeaders.ExpectContinue=true;
client.DefaultRequestHeaders.Add(“连接”,“关闭”);
返回客户;
}
私有HttpClientHandler GetClientHandler()
{
var clientHandler=新的HttpClientHandler();
回程钳;
}
似乎.net内核意味着让生活变得困难。。样板太多,容易出错。试试看。您链接到的问题不相关。这是关于Windows UWP应用程序的。你试过了吗,它甚至没有用.net内核编译。CS1061“HttpWebRequest”不包含“ClientCertificates”的定义,也没有扩展方法……您必须提供完整的问题描述,包括任何编译错误。您链接到的问题无效。从您的问题中不清楚您是否确实尝试过-听起来好像您发现并发出了链接问题,并停止了尝试链接问题也是关于HttpClient的,而不是HttpWebRequest。你试过使用HttpClient吗?为什么要使用HttpWebRequest?如何重新编写这段c代码?我应该说清楚。
private FormUrlEncodedContent GetLoginBodyAsContent(string username, string password)
{
var postData = new List<KeyValuePair<string, string>>();
postData.Add(new KeyValuePair<string, string>("username", username));
postData.Add(new KeyValuePair<string, string>("password", password));
return new FormUrlEncodedContent(postData);
}
private async Task<LoginResponse> Login(string username, string password, string certFilename)
{
var clientHandler = GetClientHandler();
var handler = AddCert(clientHandler, certFilename);
var client = InitHttpClientInstance(handler, this.AppKey);
var content = GetLoginBodyAsContent(username, password);
var result = await client.PostAsync("/api/certlogin", content);
result.EnsureSuccessStatusCode();
var jsonSerialiser = new DataContractJsonSerializer(typeof(LoginResponse));
var stream = new MemoryStream(await result.Content.ReadAsByteArrayAsync());
var response = (LoginResponse)jsonSerialiser.ReadObject(stream);
return response;
}
private HttpClientHandler AddCert(HttpClientHandler clientHandler, string certFilename)
{
var certPfx = new X509Certificate2(certFilename);
clientHandler.SslProtocols = SslProtocols.Tls12;
clientHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
clientHandler.ClientCertificates.Add(certPfx);
clientHandler.ServerCertificateCustomValidationCallback +=
(HttpRequestMessage req, X509Certificate2 cert2, X509Chain chain, SslPolicyErrors err) => { return true; };
return clientHandler;
}
private HttpClient InitHttpClientInstance(HttpMessageHandler clientHandler, string appKey, string baseUrl = DefaultAuthServiceUrl)
{
var client = new HttpClient(clientHandler);
client.BaseAddress = new Uri(baseUrl);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("X-Application", appKey);
client.DefaultRequestHeaders.ExpectContinue = true;
client.DefaultRequestHeaders.Add("Connection", "Close");
return client;
}
private HttpClientHandler GetClientHandler()
{
var clientHandler = new HttpClientHandler();
return clientHandler;
}