当前位置: 首页 > 知识库问答 >
问题:

.Net核心API返回带有请求对象的流内容

邹驰
2023-03-14

我试图从Web API返回Excel文件,但我得到的是JSON响应,而不是下载的文件。

using (var excel = new ExcelPackage())
        {
            var sheet = excel.Workbook.Worksheets.Add("Placments");

            var taxonomyConnStr = GetConnectionString(DatabaseSettings.ConnectionStringNames.Taxonomy);
            var plookConnStr = GetConnectionString(DatabaseSettings.ConnectionStringNames.Plook);
            var content = _repo.GetPlacementDataTable(masterAgencyDivisionId, masterClientId, plookConnStr);



            if (content.Rows.Count > 0)
            {
                Color colFromHex = System.Drawing.ColorTranslator.FromHtml("#000000");

                sheet.Row(1).Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
                sheet.Row(1).Style.Fill.BackgroundColor.SetColor(colFromHex);
                sheet.Row(1).Style.Font.Color.SetColor(Color.White);
                sheet.Row(1).Style.Font.Bold = true;
                sheet.Row(1).Style.Font.Size = 12;

                sheet.Cells[1, 1].LoadFromDataTable(content, true);

                sheet.Cells[sheet.Dimension.Address].AutoFitColumns();

            }
            else
            {
                sheet.Cells[1, 1].LoadFromText("There is no data for filtered results. Please adjust your selections.");
            }

            var stream = new MemoryStream();
            excel.SaveAs(stream);
            stream.Position = 0;

            var result = new HttpResponseMessage(HttpStatusCode.OK);
            result.Content = new StreamContent(stream);
            result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-sream");
            result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
            {
                FileName = "Report.xlsx"

            };

            return result;

        }

这是我的AJAX调用

$(document).ready(function () {
    $("#btnSubmit").click(function () {
           window.location = "https://localhost:44318/custom/GetPlacementExcel/6/77";
           })
})

但我得到的回应是:

{“version”:{“major”:1,“minor”:1,“build”:-1,“revision”:-1,“majorRevision”:-1,“minorRevision”:-1},“content”:{“headers”:[{“key”:“Content-Disposition”,“value”:[“attachment;filename=Report.xlsx“]},{”key“:”Content-Type“,”value“:[”application/octet-stream“]}]},”statusCode“:200,”reasonPhrase“:”OK“,”headers“:[],”requestMessage“:null,”isSuccessStatusCode“:true}

共有1个答案

徐博雅
2023-03-14

Asp.NetCore不再使用Http响应消息,因此您需要使用适当的操作结果来返回所需的数据

由于您已经将数据存储在流中,因此返回一个<code>FileStreamResult

public IActionResult MyAction() {

    //...code removed for brevity

    var stream = new MemoryStream();
    excel.SaveAs(stream);
    stream.Position = 0;
    var fileName = "Report.xlsx";
    var mimeType = "application/vnd.ms-excel";
    //return the data stream as a file
    return File(stream, mimeType, fileName); //<-- returns a FileStreamResult

}
 类似资料:
  • 回到RC1,我会这样做: 在RC2中,不再有,并且没有任何东西可以让我返回500类型的IActionResult。 我现在问的方法完全不同了吗?我们是否不再尝试捕获代码?我们是否只是让框架将一个泛型500异常抛回API调用者?对于开发,如何查看确切的异常堆栈?

  • 我一直在绞尽脑汁,以及关于同一主题的各种SO帖子(请参阅JQuery Ajax和将多个复杂对象发布到asp.net MVC控制器、将多个对象传递到我的控制器等),但我很难从Ajax调用中将多个对象发布到我的控制器(.net Core)。我相信我已经像本教程一样设置了我的代码(http://www.dotnetcurry.com/aspnet-mvc/1253/multiple-model-obje

  • . NET Core gRPC-Web客户端调用ASP.NETCore gRPC-Web服务器http://localhost:5000正常工作。 与部署到具有虚拟应用程序的IIS服务器的客户端代码调用服务器相同(例如http://build.mycompany.ca/myapp)的结果 状态(StatusCode="未实现",Detail="错误的gRPC响应。HTTP状态代码:404") 我的

  • 我是Java和Springboot的新手。尝试使用一个参数terminalId(字符串)实现一个简单的get请求。 我完全迷路了。

  • .NET核心和ASP.NET核心到底有什么区别?

  • 主要内容:SqlSessionFactoryBuilder,SqlSessionFactory,SqlSessionMyBatis 有三个基本要素: 核心接口和类 MyBatis核心配置文件(mybatis-config.xml) SQL映射文件(mapper.xml) 下面首先介绍 MyBatis 的核心接口和类,如下所示。   每个 MyBatis 应用程序都以一个 SqlSessionFactory 对象的实例为核心。 首先获取 SqlSessionFactoryBuilder 对象,可以