使用.NET HttpClientClass发送POST请求

问题描述 投票:0回答:1

我正在尝试通过 .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 文件时做错了什么。关于程序结构本身似乎没有太多选择,但我不确定。

如有任何帮助,我们将不胜感激。

async-await x509certificate dotnet-httpclient pfx postasync
1个回答
0
投票

我发现了问题。上面的代码工作得很好。问题出在代理服务器上,其中存在 SSL 检查机制,该机制通过我们组织的通用证书交换我的程序附加的证书。为我连接的 URL 的规则添加例外就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.