无法在 asp.net 核心 2.1 的中间件中写入 HttpContext 的响应主体

Unable to write to HttpContext's response body in asp.net core 2.1's middleware

这是我们中间件的代码片段

public Task InvokeAsync(HttpContext context)
{
    if(!found)
    {
        context.Response.StatusCode = StatusCodes.Status401Unauthorized;
        return context.Response.WriteAsync("Something wrong");
    }
    return _next(context);
}

问题是,虽然客户端应用程序收到错误代码 401,这很好,但 "Something wrong" 在响应正文中找不到字符串。我们在这里缺少什么?

一个对我们有用的有趣解决方案:

声明如下: return context.Response.WriteAsync("Something wrong");

被这个取代:

return context.Response.Body.WriteAsync("Something wrong").AsTask();

此更改使响应得到正确填充。虽然,我还不确定为什么这种响应人群的方式会起作用,而不是最初的方法。

你应该在这个方法的异步函数的最后使用等待:

HttpContext.Response.WriteAsync("Something wrong").Wait();

参考:What's the difference between Task.Start/Wait and Async/Await?

静态和异步方法 HttpResponseWritingExtensions.WriteAsync 是目前实现此目标的首选方法。

目前,您可以在程序集Microsoft.AspNetCore.Http.Abstractions中找到它。

using Microsoft.AspNetCore.Http;

public Task InvokeAsync(HttpContext context)
{
    if (found == false)
    {
        context.Response.StatusCode = StatusCodes.Status401Unauthorized;
        await HttpResponseWritingExtensions.WriteAsync(context.Response, "Something wrong");
    }
    return _next(context);
}

您还应该设置内容类型。 像这样

    context.Response.StatusCode = StatusCodes.Status401Unauthorized;
    context.Response.ContentType = "text/plain";
    return context.Response.WriteAsync("Something wrong");