通过写入数据以从动态Webapi响应下载excel(NPOI)

时间:2018-09-10 01:59:00

标签: c# asp.net-core-2.0 asp.net-boilerplate

我使用.net core2 ASP.NET Boilerplate。
因为我的webapi是从应用程序动态创建的。在应用程序体系结构中,由于不继承自.net核心mvc控制器,因此没有“ return File()”方法。
所以我想通过将数据写入HttpContext Response来实现downloadFile。 在.net4.x中,我使用此代码将数据写入响应,并且运行良好。但是当我在.netcore中使用它时,它将无法正常工作。

.Line

在日志中,这是一个错误“ System.InvalidOperationException:无法设置StatusCode,因为响应已经开始”。
“在D:\ Github \ aspnetboilerplate \ src \ Abp.AspNetCore \ AspNetCore \ Security \ AbpSecurityHeadersMiddleware.cs:line 26中的Abp.AspNetCore.Security.AbpSecurityHeadersMiddleware.Invoke(HttpContext httpContext)中调用。”
< / p>

我阅读了.net core mvc源代码并编辑了我的代码。如下所示:

data "azurerm_subscription" "primary" {}

data "azurerm_client_config" "test" {}

resource "azurerm_role_definition" "test" {
  role_definition_id = "00000000-0000-0000-0000-000000000000"
  name               = "my-custom-role-definition"
  scope              = "${data.azurerm_subscription.primary.id}"

  permissions {
    actions     = ["Microsoft.Resources/subscriptions/resourceGroups/read"]
    not_actions = []
  }

  assignable_scopes = [
    "${data.azurerm_subscription.primary.id}",
  ]
}

resource "azurerm_role_assignment" "test" {
  name               = "00000000-0000-0000-0000-000000000000"
  scope              = "${data.azurerm_subscription.primary.id}"
  role_definition_id = "${azurerm_role_definition.test.id}"
  principal_id       = "${data.azurerm_client_config.test.service_principal_object_id}"
}

然后api返回“ 406错误:不可接受”,下载的文件无法打开,已损坏。

我需要帮助,感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

WriteToResponse2方法更改为:

public static void WriteToResponse2(this IWorkbook book, HttpContext httpContext, string templateName)
{
    var response = httpContext.Response;
    response.ContentType = "application/vnd.ms-excel";
    SetContentDispositionHeader(httpContext, templateName);
    book.Write(response.Body);
}

在操作方法中使用时,请注意不要再次修改响应。

public void Test2() {
    var newFile = @"newbook.core.docx";
    using (var fs = new FileStream(newFile, FileMode.Create, FileAccess.Write))
    {
        IWorkbook workbook = CreateBook();
        workbook.WriteToResponse2(contextAccessor.HttpContext,"ss.xlsx");
    }
}

这是有效的屏幕截图:

enter image description here