我在ASP中创建了Wep API.Net内核返回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 returns strange JSON message中所解释的,ASP.NET Core不支持返回HttpResponseMessage(您安装了哪个包来访问该类型?).

因此,序列化程序只需将HttpResponseMessage的所有公共属性写入输出,就像其他任何不受支持的响应类型一样.

要支持自定义响应,必须返回一个类型.有plenty of those个.在你的情况下,我会研究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");
}

这只是抽象了FileContentResultFileStreamResult的创建(对于这个重载,后者).

或者,如果您正在转换旧的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();

Asp.net相关问答推荐

Azure DevOps 构建管道正在发布旧的/缓存的构建工件

创建项目 ASP.NET Core (.NET Core) 和 ASP.NET Core (.NET Framework) 有什么区别

此版本的 SQL Server 不支持用户实例登录标志.连接将关闭

ASP.NET MVC4 jquery/javascript 包的使用

如何在 Kendo UI 中获取下拉列表中选定项目的文本?

如何使用三个按钮是否和取消显示确认alert ,如 MS Word 中所示

防止 asp.net Web 表单中的跨站点请求伪造 (csrf) 攻击

什么相当于 ASP.NET 中的 cron 作业(job)?

GridView 与嵌套类的属性绑定

在 asp.net 中调整图像大小而不会丢失图像质量

Razor 主机工厂错误

如何获取 ActionLink 的工具提示?

如何确定服务器端 C# 上的浏览​​器窗口大小

与 Twitter Bootstrap Bundle 的 ASP.NET MVC4

从 IFrame 重定向父页面

对 ASP.NET 2.0 网页进行单元测试的最佳方法是什么?

如何遍历自定义 vb.net 对象的每个属性?

错误处理(向客户端发送 ex.Message)

ASP.net 网站中的 C# 密码文本框

从服务器下载 ASP.NET 文件