我们在尝试使用双向 SSL 连接到业务 API 时遇到了类似的问题。标准 .NET 库不起作用。您可以使用第三方库http://curl.haxx.se/libcurl/作为可能的解决方案之一。
libcurl 是一个免费且易于使用的客户端 URL 传输库,支持 DICT、FILE、FTP、FTPS、Gopher、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S、RTMP、RTSP、SCP、 SFTP、SMTP、SMTPS、Telnet 和 TFTP。libcurl 支持 SSL 证书、HTTP POST、HTTP PUT、FTP 上传、基于 HTTP 表单的上传、代理、cookie、用户+密码身份验证(Basic、Digest、NTLM、Negotiate、Kerberos)、文件传输恢复、http 代理隧道等。
.NET 库可以从http://sourceforge.net/projects/libcurl-net/上传
当您上传它时,将 libcurl.dll 更改为您可以找到的最新版本(它应该是 7.18.1 或更高版本)。在当前的 libcurl-nel 包中,它比需要的要旧。
public string HTTPGet(string URL, string Proxy, string certName = null, string certPassword = null)
{
Easy easy = new Easy();
SockBuff = "";
try
{
Easy.WriteFunction wf = new Easy.WriteFunction(OnWriteData);
easy.SetOpt(CURLoption.CURLOPT_URL, URL);
easy.SetOpt(CURLoption.CURLOPT_TIMEOUT, "60");
easy.SetOpt(CURLoption.CURLOPT_WRITEFUNCTION, wf);
easy.SetOpt(CURLoption.CURLOPT_USERAGENT, UserAgent);
easy.SetOpt(CURLoption.CURLOPT_COOKIEFILE, CookieFile);
easy.SetOpt(CURLoption.CURLOPT_COOKIEJAR, CookieFile);
easy.SetOpt(CURLoption.CURLOPT_FOLLOWLOCATION, true);
if (!string.IsNullOrEmpty(certName))
{
easy.SetOpt(CURLoption.CURLOPT_SSLCERT, certName);
if (!string.IsNullOrEmpty(certPassword))
{
easy.SetOpt(CURLoption.CURLOPT_SSLCERTPASSWD, certPassword);
}
}
if (URL.Contains("https"))
{
easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYHOST, 1);
easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYPEER, 0);
}
if (!string.IsNullOrEmpty(Proxy))
{
easy.SetOpt(CURLoption.CURLOPT_PROXY, Proxy);
easy.SetOpt(CURLoption.CURLOPT_PROXYTYPE, CURLproxyType.CURLPROXY_HTTP);
}
var code = easy.Perform();
easy.Cleanup();
Console.WriteLine(code);
}
catch
{
Console.WriteLine("Get Request Error");
}
return SockBuff;
}
public static Int32 OnWriteData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData)
{
// Console.Write(System.Text.Encoding.UTF8.GetString(buf));
SockBuff = SockBuff + System.Text.Encoding.UTF8.GetString(buf);
return size * nmemb;
}