无法写入 AuthenticationHandler 中的 HttpContext.Response

Cannot write to a HttpContext.Response in AuthenticationHandler

提问人:Szyszka947 提问时间:1/1/2023 最后编辑:Szyszka947 更新时间:1/1/2023 访问量:257

问:

在我的自定义中,我想像这样写入一些数据:AuthenticationHandlerHttpContext.Response

protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
    await Context.Response.WriteAsJsonAsync(new SomeObject(), Context.RequestAborted);
    return AuthenticateResult.Fail("something went wrong");
}

我总是遇到例外:

Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1] 执行请求时发生未经处理的异常。 System.InvalidOperationException:无法设置 StatusCode,因为响应已启动。

使用这些堆栈跟踪:

在 Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ThrowResponseAlreadyStartedException(字符串值) 在 Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.set_StatusCode(Int32 值) 在 Microsoft.AspNetCore.Authentication.AuthenticationHandler1.ChallengeAsync(AuthenticationProperties 属性) 在 Microsoft.AspNetCore.Authentication.AuthenticationService.ChallengeAsync (HttpContext 上下文、 字符串方案、 AuthenticationProperties 属性) 在 Microsoft.AspNetCore.Authorization.Policy.AuthorizationMiddlewareResultHandler.<>c__DisplayClass0_0.<g__Handle|0>d.MoveNext() --- 从上一个位置---结束堆栈跟踪1.HandleChallengeAsync(AuthenticationProperties properties) at Microsoft.AspNetCore.Authentication.AuthenticationHandler

和:

在 Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext 上下文) 在 Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext 上下文) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext 上下文) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext 上下文) 在 Microsoft.AspNetCore.Watch.BrowserRefresh.BrowserRefreshMiddleware.InvokeAsync(HttpContext 上下文) 在 Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication'1 应用程序)

以为出现此错误,我的请求已中止,我没有得到任何响应。如果在写入响应后我调用,则仍然会抛出异常,但我得到响应。Response.CompleteAsync()

此外,我没有任何自定义中间件。我该如何解决这个问题?

C# 核心中间件 ASP.NET-CORE -身份验证处理程序

评论

0赞 Ann L. 1/1/2023
它在哪条线上失败了?这条线?WriteAsJsonAsync
0赞 Ann L. 1/1/2023
您能否捕获并发布堆栈跟踪?
0赞 Ann L. 1/1/2023
我不确定(没有尝试过您正在尝试的),但我想知道此调用的异步性质是否意味着该应用程序在您的异步方法运行时继续处理请求。换句话说,这是一种竞争条件!
0赞 Szyszka947 1/1/2023
是的,这是在线失败。我编辑了我的问题并添加了堆栈跟踪。WriteAsJsonAsync
0赞 t3chb0t 1/1/2023
我不认为是.它必须位于,因为您正在尝试在此处设置另一个错误,而您已经使用 .这将解释为什么你会得到WriteAsJsonAsyncFailRequestAbortedInvalidOperationException: StatusCode cannot be set because the response has already started.

答: 暂无答案