我使用的是.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个小时一直在敲打我的脑袋。
谢谢!
答案 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();
}
}