如何设置ASP.NET Core应用程序的基本路径,同时禁用对根路径的访问?

时间:2018-11-22 11:26:52

标签: asp.net-core

我知道我可以使用void reverse (char *s) { if (*s!=0) { reverse (s+1); printf("%c", *s); } } 设置服务的基本路径,以便可以从app.UsePathBase("/AppPath");获得我的API,但是如果这样做,我的API也可以从根路径{{1}中获得}。如何禁用从根路径的访问?

我也尝试使用像http://foo.com/AppPath/controller1这样的路由,但是它有同样的问题。

我要这样做的原因是,当它在生产环境中部署时,将部署在应用程序前缀(而不是根应用程序)下,并且在调试过程中在本地主机上运行API时,我想模拟生产章程。

1 个答案:

答案 0 :(得分:1)

这是设计上的according to this 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?}");
        });
    }