[英]Updating the response body in middleware .NET Core
我的 .NET Core 3.1 应用程序中有一个自定义中间件,并尝试像这样设置响应 StatusCode 和 Body:
public async Task Invoke(HttpContext context)
{
if ( <some condition on context.Request> )
{
context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
await context.Response.WriteAsync("my custom message");
// Bad request, do not call next middleware.
return;
}
// Call next middleware.
await _requestDelegate(context);
}
使用上面的代码,StatusCode 设置正确,但是响应正文为空。 如何将自定义消息写入正文?
更新1:
添加了await
,但这不会解决问题。 感谢@Jonesopolis 提到这一点。
更新 2
所以我正在测试 Swagger 中的响应(我也在查看开发人员的网络选项卡)。 但是,当我在 Postman 中进行测试时,我得到了预期的响应体。
所以问题真的是为什么响应正文没有出现在 Swagger/network 选项卡中?
谢谢!
SwaggerUI
在请求中设置了一个 accept: text/plain
标头,因此 ASP.NET Core 忽略了任何未设置为此类型的内容。
更改您的代码:
public async Task Invoke(HttpContext context)
{
if (xxxx)
{
context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
context.Response.ContentType = "text/plain"; //add this line.....
await context.Response.WriteAsync("my custom message");
return;
}
await _requestDelegate(context);
}
不必在第一个块中使用 return 关键字。 您可以使用 else 块来调用下一个中间件。 有用
public class CustomMiddleware
{
private readonly RequestDelegate requestDelegate;
public CustomMiddleware(RequestDelegate requestDelegate)
{
this.requestDelegate = requestDelegate;
}
public async Task Invoke(HttpContext httpContext)
{
if(httpContext.Request.Path.Value=="/Custom")
{
httpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
await httpContext.Response.WriteAsync("my custom message");
return;
}
else
{
await requestDelegate(httpContext);
}
}
}
public static class Middlewares
{
public static void UseMyCustomMiddleware(this IApplicationBuilder applicationBuilder)
{
applicationBuilder.UseMiddleware<CustomMiddleware>();
}
}
让我直截了当。 我不认为 Swagger 是这里的问题。 如何准确指定内容类型,更重要的是,让响应完成它的工作。
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
//Unauthorized
context.Response.Headers.Add("Content-Type", "application/json");
context.Response.StatusCode = StatusCodes.Status401Unauthorized;
await context.Response.WriteAsync(JsonConvert.SerializeObject(new
{
Msg = msg,
LoginPath = _options.LoginPath.Value,
}));
await context.Response.CompleteAsync();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.