System.InvalidOperationException:无法设置StatusCode,因为响应已经开始

时间:2019-07-22 14:09:04

标签: c# .net asp.net-mvc core

我的问题是这种方法:

 [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);
        }
    }

1 个答案:

答案 0 :(得分:0)

您应在写响应之前设置响应状态代码,写响应时,请勿重定向到另一个地址(它将导致302重定向)