最小webapi默认的中间件配置是这样的
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
最小webapi没有使用app.UseRouting()
和app.UseEndpoints
。
这种情况下我们添加的所有中间件其实都是位于终结点路由中间件EndpointRoutingMiddleware
和终结点中间件EndpointMiddleware
之间的中间件。
加入我们写了一个自定义404页面的中间件,并把它注册进去。
app.Use(async (context, next) =>
{
context.Response.StatusCode = StatusCodes.Status404NotFound;
context.Response.ContentType = "text/html;charset=utf-8";
context.Response.WriteAsync("来到了知识的荒原");
await next(context);
});
这个中间件不会以我们预料的方式运行,他会在每次请求中都被调用,而不是找不到路由时才调用。
就是因为没有注册app.UseEndpoints
的终结点中间件时,不存在终结点之后的中间件。而终结点之后的中间件才会在找不到路由,找不到终结点时被调用。
终结点中间件应该是在找到了终结点时会短路管道,找不到时调用next(context)
。
所以我们必须显式调用app.UseEndpoints
,然后再到后面再注册我们的404中间件。这才会达到我们的预期。
必须注意的的是如果app.UseEndpoints
被调用,那么app.UseRouting()
也必须被调用。
所以这种情况下正确的写法是
app.UseRouting();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.UseEndpoints(endpoints=>{});
app.Use(async (context, next) =>
{
context.Response.StatusCode = StatusCodes.Status404NotFound;
context.Response.ContentType = "text/html;charset=utf-8";
context.Response.WriteAsync("来到了知识的荒原");
await next(context);
});
app.Run();
标签:webapi,UseEndpoints,终结,app,中间件,context,注意事项,Response
From: https://www.cnblogs.com/ggtc/p/18171567