【问题标题】:Exclude route from middleware - .net core从中间件中排除路由 - .net core
【发布时间】:2018-09-15 19:01:56
【问题描述】:

我在应用程序中有 2 个中间件。我想从这些中间件中排除一条路线。我尝试的是创建一个 BuildRouter 函数并通过它应用中间件,但这不起作用。

public IRouter BuildRouter(IApplicationBuilder applicationBuilder)
{
    var builder = new RouteBuilder(applicationBuilder);

    builder.MapMiddlewareRoute("/api/", appBuilder => {
        appBuilder.ApplyKeyValidation();
        appBuilder.ApplyPolicyValidation();
    });

    return builder.Build();
}

而配置方法是

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    app.UseRouter(BuildRouter(app));

    app.UseHttpsRedirection();
    app.UseMvc();       
}

但这不起作用。

【问题讨论】:

    标签: c# asp.net-core .net-core


    【解决方案1】:

    您可以使用带有否定谓词的MapWhen 扩展方法:

    app.MapWhen(
        httpContext => !httpContext.Request.Path.StartsWithSegments("/pathtoexclude"),
        subApp => subApp.UseMyMiddleware()
    );
    

    注意MapWhen 将终止管道,因此如果您希望管道在此之后继续运行,您可以改用 app.UseWhen

    【讨论】:

      【解决方案2】:

      对于中间件,您应该使用app.UseWhen 而不是app.MapWhen,因为MapWhen 会终止管道。我在尝试使用其他答案时很难学到这一点。

      已经有一段时间了,但自从我偶然发现了这个其他人也可能。因此,对于您的示例: public void Configure(IApplicationBuilder app, IHostingEnvironment env)

      public void Configure(IApplicationBuilder app, IHostingEnvironment env)
      {
          if (env.IsDevelopment())
          {
              app.UseDeveloperExceptionPage();
          }
          else
          {
              app.UseHsts();
          }
      
          app.UseWhen(
              context => !context.Request.Path.StartsWithSegments("/api"),
              appBuilder =>
              {
                  appBuilder.ApplyKeyValidation();
                  appBuilder.ApplyPolicyValidation();
              }
          );
      
          app.UseHttpsRedirection();
          app.UseMvc();       
      }
      

      【讨论】:

        【解决方案3】:

        对此处出色答案的简单调整可能是根据请求做出应用配置决策。就我而言,Blazor 的后备页面似乎正在处理向 Swagger 和 Hangfire 等中间件发出的所有请求。

        有条件地调用endpoints.MapFallbackToPage("/_Host"); 将恢复对所有可通过以/api 开头的路由访问的中间件的默认支持。下面是一个简化的例子:

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env) => ConfigureServer(app, env);
        
        void ConfigureServer(IApplicationBuilder app, IWebHostEnvironment env, bool isApiBound = true)
        {        
            //...
        
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                if (!isApiBound)
                {
                    endpoints.MapRazorPages();
                    endpoints.MapFallbackToPage("/_Host");
                }
            });
        
            //...
        
            if (isApiBound)
            {
                app.UseWhen(context => !context.Request.Path.StartsWithSegments("/api"),
                    builder => ConfigureServer(builder, env, false));
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-22
          • 2017-03-05
          • 2018-09-11
          • 2016-05-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多