/// <summary>
/// 带证书请求
/// </summary>
/// <param name="requestUrl">请求的地址</param>
/// <param name="timeout">超时时间</param>
/// <param name="requestContent">请求的字符串</param>
/// <param name="isPost">是否是POST</param>
/// <param name="encoding">字符集编码</param>
/// <param name="certificatePath">证书路径</param>
/// <param name="certPassword">证书密码</param>
/// <param name="msg">消息</param>
/// <returns>请求结果</returns>
public static string HttpWebRequestWithCertificate(string requestUrl, int timeout, string requestContent, bool isPost, string encoding, string certificatePath, string certPassword, out string msg)
{
msg = string.Empty;
string result = string.Empty;
try
{
string cert = string.Format(@"{0}", certificatePath);
string password = certPassword;
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
X509Certificate2 cer = new X509Certificate2(cert, password, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);//此处遇到一坑:在阿里云提供的服务器上用X509Certificate总是失败,改为X509Certificate2后成功
byte[] bytes = System.Text.Encoding.GetEncoding(encoding).GetBytes(requestContent);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl);
request.ClientCertificates.Add(cer);
request.ContentType = "application/x-www-form-urlencoded";
request.Referer = requestUrl;
request.Method = isPost ? "POST" : "GET";
request.ContentLength = bytes.Length;
request.Timeout = timeout * 1000;
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
if (responseStream != null)
{
StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.GetEncoding(encoding));
result = reader.ReadToEnd();
reader.Close();
responseStream.Close();
request.Abort();
response.Close();
return result.Trim();
}
}
catch (Exception ex)
{
msg = ex.Message + ex.StackTrace;
}
return result;
}
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
if (errors == SslPolicyErrors.None)
return true;
return false;
}
/// 带证书请求
/// </summary>
/// <param name="requestUrl">请求的地址</param>
/// <param name="timeout">超时时间</param>
/// <param name="requestContent">请求的字符串</param>
/// <param name="isPost">是否是POST</param>
/// <param name="encoding">字符集编码</param>
/// <param name="certificatePath">证书路径</param>
/// <param name="certPassword">证书密码</param>
/// <param name="msg">消息</param>
/// <returns>请求结果</returns>
public static string HttpWebRequestWithCertificate(string requestUrl, int timeout, string requestContent, bool isPost, string encoding, string certificatePath, string certPassword, out string msg)
{
msg = string.Empty;
string result = string.Empty;
try
{
string cert = string.Format(@"{0}", certificatePath);
string password = certPassword;
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
X509Certificate2 cer = new X509Certificate2(cert, password, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);//此处遇到一坑:在阿里云提供的服务器上用X509Certificate总是失败,改为X509Certificate2后成功
byte[] bytes = System.Text.Encoding.GetEncoding(encoding).GetBytes(requestContent);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl);
request.ClientCertificates.Add(cer);
request.ContentType = "application/x-www-form-urlencoded";
request.Referer = requestUrl;
request.Method = isPost ? "POST" : "GET";
request.ContentLength = bytes.Length;
request.Timeout = timeout * 1000;
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
if (responseStream != null)
{
StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.GetEncoding(encoding));
result = reader.ReadToEnd();
reader.Close();
responseStream.Close();
request.Abort();
response.Close();
return result.Trim();
}
}
catch (Exception ex)
{
msg = ex.Message + ex.StackTrace;
}
return result;
}
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
if (errors == SslPolicyErrors.None)
return true;
return false;
}