首页 > 解决方案 > ASP.NET Core 中的路由无法正常工作(我需要意见)

问题描述

    if (env.IsDevelopment())
    {
        //Endpoint if the application is in Developement
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                   name: "default",
                   pattern: "Workspace/{Workspace?}/{controller=Overview}/{action=Index}");
            endpoints.MapControllerRoute(
                    name: "Account",
                    pattern: "{controller=Account}/{action=AdminLogin}");
            endpoints.MapBlazorHub(options =>
            {
                options.ApplicationMaxBufferSize = 9223372036854775807;
                options.TransportMaxBufferSize = 9223372036854775807;
            });
        });
        app.MapWhen(context => IsAuthenticated(context), HandleAuthenticationIdDev);
        app.MapWhen(context => HasWorkspace(context), HandleWorkspaceId);
    }
    else
    {
        //Endpoint if the application is in Production
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "Workspace/{Workspace?}/{controller=Overview}/{action=Index}");
            endpoints.MapControllerRoute(
                    name: "Account",
                    pattern: "{controller=Account}/{action=Login}");
            endpoints.MapBlazorHub(options =>
            {
                options.ApplicationMaxBufferSize = 9223372036854775807;
                options.TransportMaxBufferSize = 9223372036854775807;
            });
            app.MapWhen(context => IsAuthenticated(context), HandleAuthenticationId);
            app.MapWhen(context => HasWorkspace(context), HandleWorkspaceId);
        });
    }
    
    private void HandleAuthenticationIdDev(IApplicationBuilder app)
    {
        app.Run(context =>
        {
            //AdminLogin action is auto-logging in with Administration Account
            context.Response.Redirect("Account/AdminLogin");
    
            return Task.FromResult(0);
        });
    }
    
    private void HandleAuthenticationId(IApplicationBuilder app)
    {
        app.Run(context =>
        {
            //Login action redirects you to Authentication website
            context.Response.Redirect("Account/Login");
    
            return Task.FromResult(0);
        });
    }
    
    private void HandleWorkspaceId(IApplicationBuilder app)
    {
        app.Run(context =>
        {
            //Login action redirects you to page where you choose your Workspace
            context.Response.Redirect("Workspaces");
    
            return Task.FromResult(0);
        });
    }

    //Checking if the request is like "domain.com/Workspace/Random-Guid-04932m/Home"
    private bool HasWorkspace(HttpContext httpContext)
    {
        return !httpContext.Request.Query.ContainsKey("Workspace");
    }

    //Checking if the user is authenticated
    private bool IsAuthenticated(HttpContext httpContext)
    {
        return !httpContext.User.Identity.IsAuthenticated;
    }

以下代码的问题是它完美地工作,然后在开发中,然后在生产中疯狂地重定向,结果如下:

开发中:自动登录后完美重定向到 /Workscpaces

自动登录后完美重定向到 /Workscpaces

完美地路由到不同的控制器和动作

完美地路由到不同的控制器和动作

然后在生产中:

生产错误

和解决方法(我可能会添加更多 ifs,但现在它完成了工作):

    [AllowAnonymous]
    [Route("")]
    public class HomeController : Controller
    {
        private readonly IWebHostEnvironment _env;
    
        public HomeController(IWebHostEnvironment _env)
        {
            this._env = _env;
        }
    
        [Route("")]
        public IActionResult Index()
        {
            if (User.Identity.IsAuthenticated)
                return RedirectToAction("Index", "Workspaces");
            else
            {
                if (_env.IsDevelopment())
                    return RedirectToAction("AdminLogin", "Account");
                else
                    return RedirectToAction("Login", "Account");
            }
        }
    }

标签: c#asp.net-core.net-coreasp.net-core-mvc.net-5

解决方案


一切都太复杂而无法正常工作,您不需要它。

使用属性路由:

public class WorkspacesController : Controller
 
 [Route("~/Workspaces/{workspase}/Index", Name="WorkSpaces")]
public IActionResult Index(string workspace)

在此之后,您可以像这样重定向:

return RedirectToRoute("Workspaces", new { workspace = ...});

推荐阅读