我的问题是这种方法:
[HttpGet]
public async Task<IActionResult> LivrerPneuParConcession(int? id)
{
if (id != null)
{
Concessionnaire con = await _context.Concessionnaires.FindAsync(id);
IList<EnsemblePneu> listesEnsembles = await GetEnsemblesPneusALivrer(con.Nom);
UImpression imp = new UImpression();
MemoryStream ms = imp.ImprimerListesDePneusALivrer(con, listesEnsembles, "Listes de pneus à livrer");
Response.ContentType = "application/pdf; charset=utf-8";
Response.Headers.Add("content-disposition", "attachment;filename=" + con.Nom + ".pdf;charset=utf-8'");
await Response.Body.WriteAsync(ms.GetBuffer(), 0, ms.GetBuffer().Length);
}
return RedirectToAction(nameof(Index));
}
上周工作了两个月。而本周,我收到了一个错误:
System.InvalidOperationException: StatusCode cannot be set because the response has already started.
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ThrowResponseAlreadyStartedException(String value)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.set_StatusCode(Int32 value)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.Microsoft.AspNetCore.Http.Features.IHttpResponseFeature.set_StatusCode(Int32 value)
at Microsoft.AspNetCore.Http.Internal.DefaultHttpResponse.Redirect(String location, Boolean permanent)
at Microsoft.AspNetCore.Mvc.Infrastructure.RedirectToActionResultExecutor.ExecuteAsync(ActionContext context, RedirectToActionResult result)
at Microsoft.AspNetCore.Mvc.RedirectToActionResult.ExecuteResultAsync(ActionContext context)
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultAsync(IActionResult result)
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResultFilterAsync[TFilter,TFilterAsync]()
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResultExecutedContext context)
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultFilters()
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
at Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)
at Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware:Warning: The response has already started, the error page middleware will not be executed.
Microsoft.AspNetCore.Server.Kestrel:Error: Connection id "0HLOEK7F1NTU2", Request id "0HLOEK7F1NTU2:00000001": An unhandled exception was thrown by the application.
我不明白为什么。它可以在IE和EDGE中使用,但在Chrome中出现错误。返回2个答案:一个PDF文件和一个返回索引页面。
工作:
[HttpGet]
public async Task LivrerPneusParConcession(int? id)
{
if (id != null)
{
Concessionnaire con = await _context.Concessionnaires.FindAsync(id);
IList<EnsemblePneu> listesEnsembles = await GetEnsemblesPneusALivrer(con.Nom);
UImpression imp = new UImpression();
MemoryStream ms = imp.ImprimerListesDePneusALivrer(con, listesEnsembles, "Listes de pneus à livrer");
Response.ContentType = "application/pdf; charset=utf-8";
Response.Headers.Add("content-disposition", "attachment;filename=" + con.Nom + ".pdf;charset=utf-8'");
await Response.Body.WriteAsync(ms.GetBuffer(), 0, ms.GetBuffer().Length);
}
}
答案 0 :(得分:0)
您应在写响应之前设置响应状态代码,写响应时,请勿重定向到另一个地址(它将导致302重定向)