NetCore API在POST请求中返回pdf文件

时间:2018-04-24 09:40:17

标签: c# api pdf post asp.net-core-2.0

我使用的是.NET Core v2.0

我尝试接受带有XML文件作为正文的发布请求,解析请求,并返回生成的PDF文件。没有太深入逻辑, 这是我在控制器中所拥有的:

public async Task<HttpResponseMessage> PostMe() {
        return await Task.Run(async () => {
            try {
                using (var reader = new StreamReader(Request.Body, Encoding.UTF8)) {
                    var serializer = new XmlSerializer(typeof(XmlDocument));
                    var objectToParse = (XmlDocument) serializer.Deserialize(reader);
                    var pdfFileLocation = await _service.ParseObject(objectToParse);

                    var response = new HttpResponseMessage(HttpStatusCode.OK);
                    var file = System.IO.File.ReadAllBytes(pdfFileLocation);

                    response.Content = new ByteArrayContent(file);
                    response.Content.Headers.Add("Content-Type", "application/pdf");

                    return response;
                }
            } catch (Exception e) {
                return new HttpResponseMessage(HttpStatusCode.BadRequest);
            }
        });
    }

XML文件是一个简单的XML文件,我将其转换为一个对象,该部分可以工作,也可以与其无关(也是NDA)。

我看到几个(超过几个)类似于我的问题,但我已经尝试了所有的东西,但还没有提出解决方案。 使用邮递员,我得到了这样的回复:

{
 "version": {
     "major": 1,
     "minor": 1,
     "build": -1,
     "revision": -1,
     "majorRevision": -1,
     "minorRevision": -1
 },
 "content": {
     "headers": [
         {
             "key": "Content-Type",
             "value": [
                 "application/pdf"
             ]
         }
     ]
 },
 "statusCode": 200,
 "reasonPhrase": "OK",
 "headers": [],
 "requestMessage": null,
 "isSuccessStatusCode": true 
}

正如您所看到的,response.Content就像没有设置任何内容一样。 100%确定,文件是在本地创建的,它是一个有效的pdf,我可以打开并查看。

我已经尝试了上述响应的许多变体,但没有任何效果。这是406或者是空的内容。谁能帮我这个?我过去4个小时一直在敲打我的脑袋。

谢谢!

1 个答案:

答案 0 :(得分:3)

在ASP.NET Core中,控制器操作返回的所有内容都是序列化的:您无法返回HttpResponseMessage,因为它也会被序列化(这就是您所看到的)在你的PostMan结果中。)

您的方法的签名应该返回IActionResult,您应该返回FileActionResult,如下所示:

public async Task<IActionResult> PostMe() {
    try {
        using (var reader = new StreamReader(Request.Body, Encoding.UTF8)) {
            var serializer = new XmlSerializer(typeof(XmlDocument));
            var objectToParse = (XmlDocument) serializer.Deserialize(reader);
            var pdfFileLocation = await _service.ParseObject(objectToParse);

            var file = System.IO.File.ReadAllBytes(pdfFileLocation);

            // creates the FileActionResult
            return File(file, "application/pdf", "my_file.pdf");
        }
    } catch (Exception e) {
        return BadRequest();
    }
}