无法在 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");
这是我们中间件的代码片段
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");