中间件在 program.cs 中工作,但在移动到它自己的 class 时不工作
Middleware works in program.cs, but not when moved to it's own class
我正在使用 asp.net core 6,在我的 program.cs 我有以下中间件,用于在状态码为 404 时重定向用户。
app.Use(async (ctx, next) =>
{
await next();
if (ctx.Response.StatusCode == 404 && !ctx.Response.HasStarted)
{
string originalPath = ctx.Request.Path.Value;
ctx.Items["originalPath"] = originalPath;
ctx.Request.Path = "/error/NotFound404";
await next();
}
});
一切正常,但我想稍微清理一下我的 program.cs,所以我决定将这段代码放在它自己的 class 中,如下所示:
public class NotFoundMiddleware
{
private readonly RequestDelegate _next;
public NotFoundMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext httpContext)
{
if (httpContext.Response.StatusCode == 404 && !httpContext.Response.HasStarted)
{
string originalPath = httpContext.Request.Path.Value;
httpContext.Items["originalPath"] = originalPath;
httpContext.Request.Path = "/error/NotFound404";
}
await _next(httpContext);
}
}
public static class NotFoundMiddlewareExtensions
{
public static IApplicationBuilder CheckNotFound(this IApplicationBuilder builder)
{
return builder.UseMiddleware<NotFoundMiddleware>();
}
}
在我的 program.cs
app.CheckNotFound(); // on the same place the upp.Use... was before.
但是后来就不行了。
我使用断点检查了我的代码。 InvokeAsync 在每次请求时都会被调用,
问题是 httpContext.Response.StatusCode
总是 returns 200
.
您的内联中间件在测试 return 值之前调用 next。 class 仅在之后调用 next。
我正在使用 asp.net core 6,在我的 program.cs 我有以下中间件,用于在状态码为 404 时重定向用户。
app.Use(async (ctx, next) =>
{
await next();
if (ctx.Response.StatusCode == 404 && !ctx.Response.HasStarted)
{
string originalPath = ctx.Request.Path.Value;
ctx.Items["originalPath"] = originalPath;
ctx.Request.Path = "/error/NotFound404";
await next();
}
});
一切正常,但我想稍微清理一下我的 program.cs,所以我决定将这段代码放在它自己的 class 中,如下所示:
public class NotFoundMiddleware
{
private readonly RequestDelegate _next;
public NotFoundMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext httpContext)
{
if (httpContext.Response.StatusCode == 404 && !httpContext.Response.HasStarted)
{
string originalPath = httpContext.Request.Path.Value;
httpContext.Items["originalPath"] = originalPath;
httpContext.Request.Path = "/error/NotFound404";
}
await _next(httpContext);
}
}
public static class NotFoundMiddlewareExtensions
{
public static IApplicationBuilder CheckNotFound(this IApplicationBuilder builder)
{
return builder.UseMiddleware<NotFoundMiddleware>();
}
}
在我的 program.cs
app.CheckNotFound(); // on the same place the upp.Use... was before.
但是后来就不行了。
我使用断点检查了我的代码。 InvokeAsync 在每次请求时都会被调用,
问题是 httpContext.Response.StatusCode
总是 returns 200
.
您的内联中间件在测试 return 值之前调用 next。 class 仅在之后调用 next。