C# 设置post请求证书代码


/// <summary>
/// Post 参数
/// </summary>
/// <param name="param"></param>
/// <param name="url"></param>
/// <param name="timeout"></param>
/// <returns></returns>
public static string PostParam(string url, string param, int timeout = 20, string certUrl = "", string mchId = "")
{
// System.GC.Collect();//垃圾回收,回收没有正常关闭的http连接

string result = "";//返回结果

HttpWebRequest request = null;
// HttpWebResponse response = null;
//Stream reqStream = null;

try
{
//设置最大连接数
ServicePointManager.DefaultConnectionLimit = 200;
//设置https验证方式
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(CheckValidationResult);
}
//证书
CommandCert(request, certUrl, mchId);

/***************************************************************
* 下面设置HttpWebRequest的相关属性
* ************************************************************/
request = (HttpWebRequest)WebRequest.Create(url);
request.UserAgent = $"{USER_AGENT}";
request.Method = "POST";
request.Timeout = timeout * 1000;

//设置代理服务器
//WebProxy proxy = new WebProxy(); //定义一个网关对象
//proxy.Address = new Uri(WxPayConfig.PROXY_URL); //网关服务器端口:端口
//request.Proxy = proxy;

//设置POST的数据类型和长度
request.ContentType = "application/json";
byte[] data = System.Text.Encoding.UTF8.GetBytes(param);
request.ContentLength = data.Length;

//往服务器写入数据
// reqStream = request.GetRequestStream();


using (Stream reqStream = request.GetRequestStream())
{
reqStream.Write(data, 0, data.Length);
reqStream.Close();
}
//获取服务端返回
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
//获取服务端返回数据
result = reader.ReadToEnd().ToString();
}
}
}
catch (System.Threading.ThreadAbortException e)
{
System.Threading.Thread.ResetAbort();
}
catch (WebException e)
{
throw new Exception(e.ToString());
}
catch (Exception e)
{
throw new Exception(e.ToString());
}
finally
{
//关闭连接和流
if (request != null)
{
request.Abort();
}
}
return result;
}


/// <summary>
/// 处理证书
/// </summary>
/// <param name="request"></param>
/// <param name="certUrl"></param>
/// <param name="mchId"></param>
private static void CommandCert(HttpWebRequest request, string certUrl = "", string mchId = "")
{
//证书路径
if (!certUrl.IsNullOrEmpty())
{
if (mchId.IsNullOrEmpty())
{
throw new Exception("MchId不能为空");
}
var certs = new X509CertificateCollection();
if (certUrl.IndexOf("http") == 0)
{
var certificate = CertificateBase64(certUrl);
certs.Add(new X509Certificate2(certificate, mchId, X509KeyStorageFlags.MachineKeySet));
}
else
{
certs.Add(new X509Certificate2(UrlHelper.GetUrl(certUrl), mchId, X509KeyStorageFlags.MachineKeySet));
}
request.ClientCertificates = certs;
}
}


/// <summary>
/// 证书文件转Base64
/// </summary>
/// <param name="CertificateUrl">证书文件路径</param>
/// <returns></returns>
public static byte[] CertificateBase64(string CertificateUrl)
{
System.Net.HttpWebRequest request = System.Net.HttpWebRequest.Create(CertificateUrl) as System.Net.HttpWebRequest;
request.Method = "GET";
//request.ContentType = "application/x-pkcs12";
//request.ProtocolVersion = new Version(1, 1);
System.Net.HttpWebResponse response = request.GetResponse() as System.Net.HttpWebResponse;
System.IO.Stream stream = response.GetResponseStream();
MemoryStream outstream = new MemoryStream();
const int bufferLen = 4096;
byte[] buffer = new byte[bufferLen];
int count = 0;
while ((count = stream.Read(buffer, 0, bufferLen)) > 0)
{
outstream.Write(buffer, 0, count);
}

outstream.Seek(0, SeekOrigin.Begin);
int buffsize = (int)outstream.Length;
byte[] bytes = new byte[buffsize];
outstream.Read(bytes, 0, buffsize);
outstream.Close();
outstream.Dispose();
stream.Close();
stream.Dispose();
return bytes;
}


/// <summary>
/// 处理网络,linux跟windows路径
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string GetUrl(string url)
{
if (url.IndexOf("http") == 0)
{
return url;
}
else
{
var currentPath = Directory.GetCurrentDirectory();
var path = Path.Combine(currentPath, url);
if (currentPath.Contains("\\"))
{
path = path.Replace("/", "\\");
}
else if (currentPath.Contains("/"))
{
path = path.Replace("\\", "/");
}

return path;
}
}

posted @ 2021-02-24 10:23  元点  阅读(676)  评论(0编辑  收藏  举报