有些特定的https网站,用C#自带的HttpClient可能会无法访问,而用浏览器访问却都正常。比如: https://www.nasdaq.com/
这是由于C#的http client没有完整实现最新的SSL规范。
此时我们有三个选择:
1、使用第三方的http实现:很遗憾,没找到。在C#下几乎没有第三方的http client,大概是官方的http client实现的太好了。
2、使用libcurl:维护不佳,libcurlnet或者curlsharp都不好用。
3、通过Process类直接调用curl.exe并获得输出。
我这里贴一下方案3的实现:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace PowerCurl
{
public class PowerCurl
{
public static string Get(string url)
{
var rr = Guid.NewGuid().ToString();
string tmpFile = Path.GetTempPath() + "/curl_temp_" + rr + ".txt";
Process p = new Process();
p.StartInfo = new ProcessStartInfo();
p.StartInfo.FileName = "curl.exe";
p.StartInfo.Arguments = string.Format("-o {0} {1}", tmpFile, url);
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.Start();
int count = 0;
while (count < 1000)
{
Thread.Sleep(10);
if (File.Exists(tmpFile))
{
while (true)
{
try
{
var ts = File.ReadAllText(tmpFile);
break;
}
catch (Exception)
{
//tmpFile还没放开,说明还没收完
Thread.Sleep(10);
}
}
break;
}
count++;
}
var ss = File.ReadAllText(tmpFile);
File.Delete(tmpFile);
return ss;
}
}
}