首页 > 解决方案 > .net core 使自定义中间件能够影响路由匹配

问题描述

我正在使用 .net core 2.2 编写一个 web api 项目,我已经定义了一个用于注销的 api,使用 [HttpGet] 属性,它工作正常。但是,当我尝试启用自定义中间件时,无法匹配注销 api,总是返回 404。我不确定自定义中间件是否导致问题。

logout api
    [Route("api/[controller]/[action]")]
    public class SysUserController : Controller
    {
        [HttpGet]
        public IActionResult Logout(string sysUserId)
        {
           some code...
        }
    }
custome middleware
public class TokenMiddleware
{
    private readonly RequestDelegate _next;
    public TokenMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public Task Invoke(HttpContext httpContext)
    {
        var token = httpContext.Request.Headers["X-Token"].ToString();
        if (token == "xxxxx")
        {
            return _next(httpContext);
        }

        httpContext.Response.ContentType = "text/json; charset=utf-8";
        httpContext.Response.StatusCode = 401;
        return httpContext.Response.WriteAsync(JsonConvert.SerializeObject(new
        {
            message = "error message"
        }));
    }
}
startup
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            ...

            app.MapWhen((httpContext) => httpContext.Request.Path.ToString().ToLower() != "/api/sysuser/login",
                (obj) => obj.UseTokenMiddleware());
            app.UseMvc();
        }

标签: asp.net

解决方案


看起来不错,只需将Configure方法更改为:

app.MapWhen((httpContext) => httpContext.Request.Path.ToString().ToLower() != "/api/sysuser/login",
            (obj) => obj.UseMiddleware<TokenMiddleware>());
        app.UseMvc();

经过测试,它可以工作


推荐阅读