如何设置ASP.NET Core应用程序同时禁用从根路径的访问



我知道我可以使用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问题设计的。

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?}");
});
}

最新更新