Asp.net-Core

如何在禁用根路徑訪問的同時設置 ASP.NET Core 應用程序的基本路徑?

  • May 21, 2021

我知道我可以使用設置我的服務的基本路徑,app.UsePathBase("/AppPath");以便我的 API 可用,http://example.com/AppPath/controller1但如果我這樣做,我的 API 也可以從根路徑獲得http://example.com/controller1。如何禁用從根路徑的訪問?

我也嘗試使用這樣的路線, app.UseMvc(routes => routes.MapRoute("default", "IRate/{controller}/{action}/{id?}"));但它有同樣的問題。

我想這樣做的原因是,當它部署在生產環境中時,它將部署在應用程序前綴下(而不是作為根應用程序),並且當我在調試期間在本地主機上執行 API 時,我想模擬生產條件。

這是根據這個 Github issue設計的。

UsePathBase 主要是為了讓這些段遠離你,因為它們是一個部署細節,如果它們留下來,它會弄亂你的路由。

考慮替代方案。如果要禁用根路徑,它會怎麼做?404 並不合適,大概該路徑在託管根的站點的單獨實例上可用。如果您真的想要 404,可以使用如上所示的 Map。

如果要在訪問根目錄時返回 404,可以使用嵌套映射,該問題中對此進行了描述:

在這種情況下,您可能想要更接近這個的東西,嵌套MapMiddleware

public void Configure(IApplicationBuilder app)
{
   app.Map("/basepath", mainapp =>
   {
       mainapp.Map("/ping", map => map.Run(async
           ctx => await ctx.Response.WriteAsync("pong")));

       mainapp.UseMvc();
   });
}

通過這種方式,您只為來自. 的請求指定映射、路由等/basepath。其他所有內容都被丟棄並返回 404。

您必須記住呼叫mainapp而不是app所有配置呼叫。否則,您最終可能會得到指向根目錄而不是自定義基本路徑的腳本和 css URL。您可以通過將配置程式碼提取Configure(app,env)到單獨的方法中來避免這種情況,例如:

   public void Configure(IApplicationBuilder app, IHostingEnvironment env)
   {
       app.Map("/AppPath", mainapp =>
       {
           mappedConfigure(mainapp,env);
       });
   }

   private void mappedConfigure(IApplicationBuilder app,IHostingEnvironment env)
   {
       if (env.IsDevelopment())
       {
           app.UseDeveloperExceptionPage();
       }
       else
       {
           app.UseExceptionHandler("/Home/Error");
           // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
           app.UseHsts();
       }

       app.UseHttpsRedirection();
       app.UseStaticFiles();
       app.UseCookiePolicy();

       app.UseMvc(routes =>
       {
           routes.MapRoute(
               name: "default",
               template: "{controller=Home}/{action=Index}/{id?}");
       });
   }

引用自:https://stackoverflow.com/questions/53429942