首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >StatusCode: 400 BadRequest使用HttpClient发布和上传PDF

StatusCode: 400 BadRequest使用HttpClient发布和上传PDF
EN

Stack Overflow用户
提问于 2022-03-04 13:03:47
回答 2查看 1K关注 0票数 -1

我有个问题。我在一台机器上创建了一个API,它接收请求并将它们发送给用户签名(必须这样做)。它通过邮递员工作得很好:

标题:

但是,当我试图连接一个客户端(在我的示例中是一个默认控制台应用程序)时,我得到了400个状态代码响应:

代码语言:javascript
运行
复制
StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers:
{
  Transfer-Encoding: chunked
  Server: Microsoft-IIS/10.0
  X-Powered-By: ASP.NET
  Date: Fri, 04 Mar 2022 12:48:43 GMT
  Content-Type: application/problem+json; charset=utf-8
}

进行调用的代码是:

代码语言:javascript
运行
复制
static async void SendPDFToEsign2()
    {
        var fileInfo = new FileInfo(@"C:\Users\Raul\Documents\PDFReadTest\Test.pdf");
        var participantSSN = "14812149181";

        var postContent = new MultipartFormDataContent();
        var fileContent = new StreamContent(new FileStream(fileInfo.FullName, FileMode.Open));
        fileContent.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/pdf");
        postContent.Headers.ContentType = new MediaTypeWithQualityHeaderValue("multipart/form-data");
        postContent.Add(fileContent, "receivedPdf");
        postContent.Add(new StringContent(participantSSN), "signerID");


        var client = new HttpClient();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("multipart/form-data"));
        client.BaseAddress = new Uri("https://esign.testapp.uib.no");

        var result = client.PostAsync("/api/", postContent).Result;

        Console.WriteLine(result);
    }

我已经尝试了很多我找到的解决方案,也用过。

代码语言:javascript
运行
复制
using (var client = new HttpClient())
        {
            using (var fs = File.OpenRead(pathtofile))
            {
                //code to send it
            }
        }

但在这种情况下似乎什么都不起作用?如果您认为这很重要,那么被调用的API看起来像,但是它通过postman正常工作,所以我只想通过c#重新创建postman调用,这样我就可以开始将它集成到主系统中。

->编辑<--

设法得到了这样的200 OK响应:

代码语言:javascript
运行
复制
    var url = new Uri("https://esign.testapp.uib.no");
    var participantSSN = "14812149181";
    var fileInfo = new FileInfo(@"C:\Users\Raul\Documents\PDFReadTest\Test.pdf");
    using var client = new HttpClient();
    using var content = new ByteArrayContent(File.ReadAllBytes(fileInfo.FullName));
    var postContent = new MultipartFormDataContent();
    postContent.Add(content, "receivedPdf", "Test.pdf");
    postContent.Add(new StringContent(participantSSN), "signerID");
    content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/pdf");
    var requestUri = "/api/";
    client.BaseAddress = url;

    var result = client.PostAsync(requestUri, postContent).Result;

    Console.WriteLine(result);
    Console.WriteLine($"Response : {result.StatusCode}");

但是我无法得到我需要的JSON响应(如上面的Postman图片所示)。我只能得到这个:

知道怎么才能得到邮递员给我的好答复吗?

->编辑2:修正<

代码语言:javascript
运行
复制
public static async Task<HttpResponseMessage> PostPDF(System.IO.FileStream fsPDF, Participant participant)
        {
            // setup
            using var client = new HttpClient();
            var url = new Uri("https://esign.testapp.uib.no");
            using var fileContent = new StreamContent(fsPDF);
            fileContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/pdf");
            var requestUri = "/api/";
            client.BaseAddress = url;

            // add auth token
            //var _bearerToken = "";
            //client.DefaultRequestHeaders.Add("Authorization", "Bearer " + _bearerToken);

            // setup request data 
            MultipartFormDataContent httpContent = new MultipartFormDataContent();
            httpContent.Add(fileContent, "receivedPdf", "Test4.pdf"); // Hardcoded Name Test4
            httpContent.Add(new StringContent(participant.SocialSecurityNo), "signerID");

            // make the call
            var response = client.PostAsync(requestUri, httpContent);

            // return the response. perhaps save it in the DB too
            return response.Result;
        }

希望这能帮到别人!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-08 14:15:41

检查最后一次编辑,我自己就这样修改了。评论这一点,这样我就可以把这个问题标为已解决了。

票数 -2
EN

Stack Overflow用户

发布于 2022-03-04 13:37:52

密码似乎是合理的。

看起来,如果文件是空的或太大,API将返回一个400。我敢打赌,您已经检查过它是否大于5MB,所以我猜该文件并没有被实际读取,而是发送了0字节的PDF。

通过检查内容,你是否检查了实际发布的内容?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71351859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档