我正在创建一个 .NET Core 3.1 Web API 方法来下载给定文件名的 pdf。此方法在使用 NSwag 生成客户端代码的团队之间共享。
我最近将 Produces 属性从 json
更改为 Produces("Application/pdf")
,需要进行此更改,以便其他团队可以生成有效的客户端代码。但是,自从此更改以来,我无法通过此方法下载任何文件。下载文档的请求返回 406 错误(在 Postman 中),并且以下错误将记录到服务器事件查看器中。
找不到内容类型“application/pdf、application/pdf”的输出格式化程序来写入响应。
将生成的内容类型恢复为“application/json”确实允许下载文档,但如上所述,该值必须为 pdf。
如有任何建议,我们将不胜感激。
方法:
[HttpGet("{*filePath}")]
[ProducesResponseType(typeof(FileStreamResult), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[Produces("Application/pdf")]
public async Task<ActionResult> GetDocument(string fileName) {
RolesRequiredHttpContextExtensions.ValidateAppRole(HttpContext, _RequiredScopes);
var memoryStream = new MemoryStream();
var memoryStream = new MemoryStream();
using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 4096, useAsync: true)) {
stream.CopyTo(memoryStream);
}
memoryStream.Seek(offset: 0, SeekOrigin.Begin);
return new FileStreamResult(memoryStream, "Application/pdf");
}
最佳答案
我刚刚遇到了同样的错误,经过一番调查,我发现异常的原因确实是在模型绑定(bind)错误
中。您已经在答案中写到了这一点,但经过仔细检查,很明显,原因与绑定(bind)本身无关,而是与响应正文有关。
由于您指定了[Produces("application/pdf")]
,框架假定此内容类型是此操作的唯一可能,但是当引发异常时,您会得到application/json
包含错误描述。
因此,要使其适用于“快乐路径”和异常,您可以指定多种响应类型:
[Produces("application/pdf", "application/json")]
public async Task<ActionResult> GetDocument(string fileName)
{
...
}
关于pdf - .NET Core pdf下载器 "No output formatter was found for content types '应用程序/pdf'...”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63792713/