使用 ASP.NET Core 将 PDF 返回到浏览器

2023-11-29

我在 ASP.Net core 中创建了 Web API 以返回 PDF。这是我的代码:

public HttpResponseMessage Get(int id)
{
    var response = new HttpResponseMessage(System.Net.HttpStatusCode.OK);           
    var stream = new System.IO.FileStream(@"C:\Users\shoba_eswar\Documents\REquest.pdf", System.IO.FileMode.Open);
    response.Content = new StreamContent(stream);
    response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
    response.Content.Headers.ContentDisposition.FileName = "NewTab";
    response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/pdf");
    return response;
}

但它只返回 JSON 响应:

{
   "version":{
      "major":1,
      "minor":1,
      "build":-1,
      "revision":-1,
      "majorRevision":-1,
      "minorRevision":-1
   },
   "content":{
      "headers":[
         {
            "key":"Content-Disposition",
            "value":[
               "attachment; filename=NewTab"
            ]
         },
         {
            "key":"Content-Type",
            "value":[
               "application/pdf"
            ]
         }
      ]
   },
   "statusCode":200,
   "reasonPhrase":"OK",
   "headers":[

   ],
   "requestMessage":null,
   "isSuccessStatusCode":true
}

我在这里做错了什么吗?


正如中所解释的ASP.NET Core HTTPRequestMessage 返回奇怪的 JSON 消息, ASP.NET Core 不支持返回HttpResponseMessage(您安装了什么软件包来访问该类型?)。

因此,序列化器只是简单地写入所有公共属性HttpResponseMessage到输出,就像任何其他不受支持的响应类型一样。

要支持自定义响应,您必须返回IActionResult-实施类型。有很多这样的。对于你的情况,我会调查FileStreamResult:

public IActionResult Get(int id)
{
    var stream = new FileStream(@"path\to\file", FileMode.Open);
    return new FileStreamResult(stream, "application/pdf");     
}

或者简单地使用PhysicalFileResult,其中为您处理流:

public IActionResult Get(int id)
{
    return new PhysicalFileResult(@"path\to\file", "application/pdf");
}

当然,所有这些都可以使用辅助方法来简化,例如Controller.File():

public IActionResult Get(int id)
{
    var stream = new FileStream(@"path\to\file", FileMode.Open);
    return File(stream, "application/pdf", "FileDownloadName.ext");
}

这只是抽象了一个FileContentResult or FileStreamResult(对于这种过载,后者)。

或者,如果您要转换较旧的 MVC 或 Web API 应用程序,并且不想一次转换所有代码,请添加对WebApiCompatShim (NuGet)并将当前代码包装在ResponseMessageResult:

public IActionResult Get(int id)
{
    var response = new HttpResponseMessage(HttpStatusCode.OK);           
    var stream = ...
    response.Content...

    return new ResponseMessageResult(response);
}

如果你不想使用return File(fileName, contentType, fileDownloadName),那么FileStreamResult不支持从构造函数或通过属性设置内容处置标头。

在这种情况下,您必须在返回文件结果之前自行将该响应标头添加到响应中:

var contentDisposition = new ContentDispositionHeaderValue("attachment");
contentDisposition.SetHttpFileName("foo.txt");
Response.Headers[HeaderNames.ContentDisposition] = contentDisposition.ToString();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ASP.NET Core 将 PDF 返回到浏览器 的相关文章

随机推荐

  • 从 JSP 输出创建 PDF

    我有一个带有 PDF 导出选项的网页 我必须在 PDF 中显示页面的内容 目前我使用 iText PDF Library 来生成 PDF 问题是使用 iText 创建 PDF 是一个相当大的挑战 此外 我们经常对网页的布局 UI 进行更改
  • Android静态方法可以很好地实时绘制后台线程数据,但这是一个好的解决方案吗?

    我一直在问一系列关于我的 Android 项目的不断变化的问题 该项目不断实时绘制蓝牙数据 而且我在提问方面也做得不太好 所以我需要做的是编辑这个问题 清理它 添加重要的细节 最重要的是我需要添加相关代码部分的代码片段 特别是我已经修改过很
  • 广告拦截器会拦截 Ajax 调用响应 html

    我正在页面上呈现一些统计信息 因为这需要一些时间 我在页面加载后将此请求作为 ajax 调用
  • 限制插件汇编代码访问

    我想创建一个插件架构 在其中我可以将程序集 API 限制为非常受限制的内容 即仅允许函数白名单 是否可以限制插件程序集可以调用哪些函数 方法 我可以使用 AppDomains 来做到这一点吗 有人有一个简单的例子吗 NET 添加了可能符合要
  • 最小的 Android 小部件,从未收到 APPWIDGET_DELETED 和 APPWIDGET_DISABLED 意图

    我遇到的问题与之前提出的问题非常相似 但不完全相同 参考 1 2 3 4 我编写了一个最小的 Android 小部件 并且APPWIDGET DELETED and APPWIDGET DISABLED从未被收到 在上面的参考文献1和2中
  • 有了 ASP.NET 会员资格,我如何显示 403?

    默认情况下 当用户无权访问受保护页面时 ASP NET 的成员资格提供程序将重定向到 loginUrl 有没有办法在不重定向用户的情况下显示自定义 403 错误页面 我想避免将用户发送到登录页面并在地址栏中显示 ReturnUrl 查询字符
  • 根据url参数设置Cookie

    每当用户点击我们的附属链接之一并登陆我们的 URL 中包含 src uni 的网站时 我都需要设置一个 cookie URL 将如下所示 创建cookie的函数 function SetCookie var url window locat
  • 有哪些比 .gitignore 更有效的方法可以将文件保留在存储库之外?

    我的开发团队中的人员不断推送特定于构建的文件 文件夹节点模块和其他 到我们的存储库中 尽管这些文件位于 gitignore文件 大概是git add all f或与之相关的东西 这是一种巨大的痛苦 而且事实证明让人们停止这样做很困难 有什么
  • IdentityServer4反向通道注销问题

    在 ASP NET Core 2 上使用 IdentityServer4 使用 ASP NET MVC5 与此用例相关的两个客户端 编辑 使用cookie进行身份验证 隐式流程 使用反向通道注销 如下所示 涉及 4 个应用程序 两个客户端
  • 如何在 Zend Framework 2 应用程序中模块的 getConfig() 中使用 global.php/local.php 配置?

    在 ZF2 应用程序中 我有一些配置 即 1 需要根据环境而有所不同 2 特定于具体模块 我目前正在使用它here描述 全局 php 和本地 php return array modules gt array Cache gt array
  • Swift:触发 TableViewCell 导致另一个 ViewController 中 UIWebView 中的链接

    当我点击一个tableViewCell我想要一个链接 特定于该单元格的indexPath row 在带有 webView 的新 viewController 中打开 示例 我点击了第三个单元格tableViewwww apple com 将
  • 如何在iOS中制作其他语言的键盘

    我想创建一个与 iPhone 键盘不同的高棉键盘 我怎样才能做到这一点 不幸的是 您无法控制键盘的语言 用户通过设置应用程序选择他们想要使用的键盘 并可以使用键盘上的地球图标在它们之间切换 打开键盘后 它将打开最近使用的键盘
  • Feign 客户端 - 动态授权标头

    我有一项服务可以获取带有授权标头的 http 请求 在处理请求时 我想使用 Feign Client 来查询另一个服务 对其他服务的查询应包含相同的授权标头 目前 我使用 Filter 从传入请求中提取授权标头 并将标头存储在 Thread
  • RxJS Observables 嵌套订阅?

    有什么方法可以简化像下面的代码示例这样的事情 我找不到合适的运营商 有人可以举一个简短的例子吗 this returnsObservable1 subscribe success gt this returnsObservable2 sub
  • SonarQube 和 BitBucket 在 Pull 请求上集成

    我是 BitBucket 的新手 继承了一个项目 现在正在尝试加快速度并完成代码 我们有一个 DevSecOps 管道 使用 BitBucket 作为 SCM SonarQube 作为静态分析引擎以及 Maven 或 Jenkins 具体取
  • 指南是否保证是唯一的?

    我使用 Guid 作为数据库中的主键 想知道是否有可能生成重复的 Guid 指南是否保证是唯一的 虽然不能保证每个生成的 GUID 都是唯一的 但唯一键的总数 2 128 或 3 4 10 38 非常大 因此相同数字生成两次的概率非常小 例
  • 错误:异步模块或处理程序已完成,而异步操作仍处于挂起状态

    我有一个控制器操作方法来保存用户详细信息 如下所示 public async Task
  • 如何从sklearn管道变压器中提取特征名称?

    以供参考 Python 3 8 3 sklearn 1 0 2 我有一个scikit learn pipeline为我格式化一些数据 如下所述 我定义我的pipeline像这样 Pipeline 1 cat selector make co
  • Cassandra 性能随时间更新行

    我正在尝试确定 Cassandra 是否适合我的应用程序 因为未知我们将来需要扩展多少并且可能会迅速发生 我一直在观看 2013 年 C 峰会的各个部分 具体来说 Axel Liljencrantz Spotify 的后端开发人员 在这里说
  • 使用 ASP.NET Core 将 PDF 返回到浏览器

    我在 ASP Net core 中创建了 Web API 以返回 PDF 这是我的代码 public HttpResponseMessage Get int id var response new HttpResponseMessage S