我使用.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错误:不可接受”,下载的文件无法打开,已损坏。
我需要帮助,感谢您的帮助。
答案 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");
}
}
这是有效的屏幕截图: