c# - 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
完美地路由到不同的控制器和动作
然后在生产中:
和解决方法(我可能会添加更多 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");
}
}
}
解决方案
一切都太复杂而无法正常工作,您不需要它。
使用属性路由:
public class WorkspacesController : Controller
[Route("~/Workspaces/{workspase}/Index", Name="WorkSpaces")]
public IActionResult Index(string workspace)
在此之后,您可以像这样重定向:
return RedirectToRoute("Workspaces", new { workspace = ...});
推荐阅读
- pandas - 如何在熊猫数据框中循环或重复代码?
- javascript - 输入输出不会立即更新它会延迟
- c - 在c中的静态const结构中强制成员初始化
- azure - 将无服务器用于大规模云数据库
- javascript - 尽可能简单地更新数量而不创建带有角度的新行
- javascript - 有没有办法使用 Javascript 判断 Cystoscape 节点是否位于某个坐标?
- mysql - 将数据转换并导入 MySQL 数据库
- c++ - 标准字符串短字符串优化有没有办法找出最大短尺寸?
- python - 计算熊猫系列字典中的值
- azure-active-directory - 无法使用扩展数据创建事件