相关:Modify static file response in ASP.NET Core
但是,我不明白为什么当我的业务逻辑抛出我的自定义异常之一(如 UnprocessableException
)时以下代码有效:
try
{
await next.Invoke(context);
}
catch (UnprocessableException uex)
{
Logger.Warn(uex);
context.Response.StatusCode = 422;
var responseContent = JsonConvert.SerializeObject(new { uex.Message });
await context.Response.WriteAsync(responseContent);
}
// more specific exceptions resulting in HTTP 4xx status
但是当完全意外的IndexOutOfRangeException
被链中的最后一个catch
block 捕获时
catch (Exception ex)
{
Logger.Error(ex);
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
var responseContent = env.IsDevelopment()
? JsonConvert.SerializeObject(new { ex.Message, ex.StackTrace })
: JsonConvert.SerializeObject(new { Message = "An internal error occured" });
await context.Response.WriteAsync(responseContent);
}
尝试设置状态码时抛出此异常:
System.InvalidOperationException: StatusCode cannot be set, response has already started.
bei Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame.ThrowResponseAlreadyStartedException(String value)
bei Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame.set_StatusCode(Int32 value)
bei Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame.Microsoft.AspNetCore.Http.Features.IHttpResponseFeature.set_StatusCode(Int32 value)
bei Microsoft.AspNetCore.Http.Internal.DefaultHttpResponse.set_StatusCode(Int32 value)
bei Anicors.Infrastructure.Middlewares.ScopeMiddleware.<Invoke>d__5.MoveNext()
最佳答案
既然这是 Google 上的顶级搜索结果,我不妨告诉新来者我是如何想到这个错误的。
我正在尝试使用 this通过压缩文件并将它们下载(流式传输)到客户端来回答。我在实际 Controller 操作结束时返回了 return Ok()
。我需要返回 return new EmptyResult()
关于c# - ASP.Net Core 中间件无法设置异常状态码,因为 "response has already started",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45675102/