簡體   English   中英

從中間件中排除路由 - .net core

[英]Exclude route from middleware - .net core

我在應用程序中有 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();       
}

但這是行不通的。

您可以使用帶有否定謂詞的MapWhen擴展方法:

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

注意MapWhen將終止管道,因此如果您希望管道在此之后繼續,您可以改用app.UseWhen

對於中間件,你應該使用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();       
}

對這里精彩答案的簡單改編可能是根據請求做出應用程序配置決策。 就我而言,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));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM