我有简单的asp核心中间件
using System.Diagnostics;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
namespace Web.Identity
{
public class UserContextHttpMiddleware
{
private readonly RequestDelegate _next;
public UserContextHttpMiddleware(RequestDelegate next)
{
_next = next;
}
public Task Invoke(HttpContext context)
{
Trace.WriteLine(context.Request.Path);
return _next(context);
}
}
}
刷新页面后,我在输出中有这个
/
/assets/images/avatar-2.jpg
/assets/images/avatar-3.jpg
/assets/images/avatar-6.jpg
/assets/images/avatar-5.jpg
/assets/images/avatar-7.jpg
/assets/images/avatar-8.jpg
/assets/images/avatar-4.jpg
/assets/images/avatar-1.jpg
/images/user-background.png
/assets/images/avatar-10.jpg
/assets/images/avatar-9.jpg
第一行是对控制器的请求。其他行是对静态内容的请求。 那么,我如何只过滤将由控制器处理的请求并忽略对静态内容的请求?怎么知道当前请求是对控制器的请求?
答案 0 :(得分:2)
中间件按照注册顺序执行(app.UseXxx
来电,请参阅docs)。
因此,如果您在MVC中间件之前注册您的中间件,它应该只记录这些。请注意,它也会记录不存在的路线。
app.UseMiddleware<UserContextHttpMiddleware>();
app.UseMvc();
或者,您可以将中间件注册到操作,这有点复杂(请参阅Using middleware in the filter pipeline docs)。
public class UserContextHttpPipeline
{
public Configure(IApplicationBuilder app)
{
app.UseMiddleware<UserContextHttpMiddleware>();
}
}
然后将其注册为全局过滤器
services.AddMvc(options =>
{
options.Filters.Add(new MiddlewareFilter(typeof(UserContextHttpMiddleware2)));
});
这会将中间件注册到每个操作,并在Mvc中间件之后调用。这还应该确保只记录有效的操作,而不记录无效的路由。