仅处理具有中间件的控制器请求

时间:2017-04-21 20:13:12

标签: http asp.net-core middleware

我有简单的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

第一行是对控制器的请求。其他行是对静态内容的请求。 那么,我如何只过滤将由控制器处理的请求并忽略对静态内容的请求?怎么知道当前请求是对控制器的请求?

1 个答案:

答案 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中间件之后调用。这还应该确保只记录有效的操作,而不记录无效的路由。

相关问题