在 ASP.NET Core 3 中使用中间件修改响应
Modify response using middleware in ASP.NET Core 3
我的目标是编写一个中间件,负责记录对我的 API 的请求以及 API 对数据库中这些请求的响应。
我已经制作了一个以类似方式处理异常的中间件,但我对此感到困惑。
当您阅读有关中间件的 MSDN 时,您会看到这张漂亮的图片:
这会让你认为中间件 2 接收请求,对其进行某些操作并将其传递给中间件 3,然后一旦中间件 3 完成所有处理,它就会将控制权传递回中间件 2 以进行其他处理。
我唯一不明白的是,如果 Middleware 2 Invoke() 方法在请求期间仅调用一次而在响应期间不调用,如何记录响应?
Startup.cs:
app.UseMiddleware<RequestLoggingMiddleware>();
中间件:
public class RequestLoggingMiddleware
{
private readonly RequestDelegate nextMiddleware;
public RequestLoggingMiddleware(RequestDelegate nextMiddleware)
{
this.nextMiddleware = nextMiddleware;
this.options = options;
}
public async Task Invoke(HttpContext context)
{
System.Diagnostics.Debug.WriteLine("Middleware runs");
await nextMiddleware(context);
}
}
}
在上面的示例中,我在控制台中只看到 "Middleware runs" 一次,在初始请求期间但在做出响应之前。我怎样才能在响应周期内达到 运行?
要获得响应,您需要做的就是在 await nextMiddleware(context);
行之后应用相同的逻辑。
例如,要记录状态码:
public class RequestLoggingMiddleware
{
private readonly RequestDelegate nextMiddleware;
public RequestLoggingMiddleware(RequestDelegate nextMiddleware)
{
this.nextMiddleware = nextMiddleware;
}
public async Task Invoke(HttpContext context)
{
System.Diagnostics.Debug.WriteLine("Middleware runs");
await nextMiddleware(context);
System.Diagnostics.Debug.WriteLine($"Response Code: {context.Response.StatusCode}");
}
}
我的目标是编写一个中间件,负责记录对我的 API 的请求以及 API 对数据库中这些请求的响应。 我已经制作了一个以类似方式处理异常的中间件,但我对此感到困惑。 当您阅读有关中间件的 MSDN 时,您会看到这张漂亮的图片:
这会让你认为中间件 2 接收请求,对其进行某些操作并将其传递给中间件 3,然后一旦中间件 3 完成所有处理,它就会将控制权传递回中间件 2 以进行其他处理。
我唯一不明白的是,如果 Middleware 2 Invoke() 方法在请求期间仅调用一次而在响应期间不调用,如何记录响应?
Startup.cs:
app.UseMiddleware<RequestLoggingMiddleware>();
中间件:
public class RequestLoggingMiddleware
{
private readonly RequestDelegate nextMiddleware;
public RequestLoggingMiddleware(RequestDelegate nextMiddleware)
{
this.nextMiddleware = nextMiddleware;
this.options = options;
}
public async Task Invoke(HttpContext context)
{
System.Diagnostics.Debug.WriteLine("Middleware runs");
await nextMiddleware(context);
}
}
}
在上面的示例中,我在控制台中只看到 "Middleware runs" 一次,在初始请求期间但在做出响应之前。我怎样才能在响应周期内达到 运行?
要获得响应,您需要做的就是在 await nextMiddleware(context);
行之后应用相同的逻辑。
例如,要记录状态码:
public class RequestLoggingMiddleware
{
private readonly RequestDelegate nextMiddleware;
public RequestLoggingMiddleware(RequestDelegate nextMiddleware)
{
this.nextMiddleware = nextMiddleware;
}
public async Task Invoke(HttpContext context)
{
System.Diagnostics.Debug.WriteLine("Middleware runs");
await nextMiddleware(context);
System.Diagnostics.Debug.WriteLine($"Response Code: {context.Response.StatusCode}");
}
}