我正在尝试通过 .NET 框架使用 http POST 发送 CSV 文件。在这里查阅了各种线程后,最重要的是“发送带有附加 pfx 证书的休息请求”我总是以接收方回答状态代码 401“未经授权”。
我已向接收机构提供了专门为其颁发的客户证书的公共部分。我从本地计算机将证书导出为 .pfx 文件,包括私有部分。 在我的程序的第一个版本中,我显然犯了一个错误,只附加了证书的公共部分。 (接收方要求他们检查我收到的消息后的声明)。 但现在,导出了包括私有部分的证书后,我不再明白问题是什么。 我发送的 URL 已与接收方核实,它是正确的。
这是我的主要程序:
handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.SslProtocols = SslProtocols.Tls12;
handler.ClientCertificates.Add(new X509Certificate(_cnf_CertificateLocalPath, "thepassword"));
fs = new FileStream(_cnf_FileToTransfer, FileMode.Open);
sr = new StreamReader(fs, Encoding.Default);
fileContent = sr.ReadToEnd();
sr.Dispose();
fs.Dispose();
Task mytask = Upload(handler, fileContent, "myfile.csv");
System.Threading.Thread.Sleep(5000);
currentTimestamp = DateTime.Now.Year.ToString() + "_" +
DateTime.Now.Month.ToString().PadLeft(2, '0') + "_" +
DateTime.Now.Day.ToString().PadLeft(2, '0') + "_" +
DateTime.Now.Hour.ToString().PadLeft(2, '0') + "_" +
DateTime.Now.Minute.ToString().PadLeft(2, '0') + "_" +
DateTime.Now.Second.ToString().PadLeft(2, '0') + "_" +
DateTime.Now.Millisecond.ToString().PadLeft(3, '0');
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("end of program run at {0}", currentTimestamp);
//Console.WriteLine("==> end of program run");
Console.WriteLine("==> press any key to close window");
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Console.ReadLine();
}
这里是上传方法本身:
public static async Task Upload(HttpClientHandler handler, string parmInFileContent, string fileName)
{
using (var client = new HttpClient(handler))
{
using (var content =
new StringContent(parmInFileContent, Encoding.UTF8, "text/csv"))
{
using (
var message =
await client.PostAsync(_API_URL, content))
{
if (message.IsSuccessStatusCode)
{
Console.ForegroundColor = ConsoleColor.Green;
}
else
{
Console.ForegroundColor = ConsoleColor.Yellow;
}
Console.WriteLine(message.Content.ToString());
Console.WriteLine(message.StatusCode.ToString());
Console.WriteLine(message.ToString());
Console.WriteLine(message.Headers.Warning.ToString());
}
}
}
}
我怀疑我在生成 .pfx 文件时做错了什么。关于程序结构本身似乎没有太多选择,但我不确定。
如有任何帮助,我们将不胜感激。
我发现了问题。上面的代码工作得很好。问题出在代理服务器上,其中存在 SSL 检查机制,该机制通过我们组织的通用证书交换我的程序附加的证书。为我连接的 URL 的规则添加例外就可以了。