.net 5 剃须刀页面路由
.net 5 razor page routing
在我们的一个项目 (.NET 5) 中,Razor 页面路由的行为有点奇怪。中间件管道没有什么特别的:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); });
}
甚至服务也不包含任何额外内容:
public void ConfigureServices(IServiceCollection services)
{
string connectionString = Configuration.GetConnectionString("DefaultConnection");
// for scoped services (mainly for identity)
services.AddDbContext<DbEntities>(options =>
options.UseSqlServer(connectionString));
AddIdentity(services);
services.AddDatabaseDeveloperPageExceptionFilter();
services.AddRazorPages()
.AddRazorRuntimeCompilation();
}
private void AddIdentity(IServiceCollection services)
{
services.AddDefaultIdentity<ApplicationUser>(options =>
{
options.SignIn.RequireConfirmedAccount = true;
options.User.RequireUniqueEmail = true;
options.Password.RequiredLength = 6;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireDigit = false;
options.Password.RequireLowercase = false;
options.Password.RequireUppercase = false;
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
})
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<DbEntities>();
// this is needed because passwords are stored with old hashes
services.Configure<PasswordHasherOptions>(options =>
options.CompatibilityMode = PasswordHasherCompatibilityMode.IdentityV2
);
}
我们搭建了一些身份 RazorPages:
当我们在 ProjectRoot/Areas/Identity/Pages/Account/Login.cshtml.cs
和 运行 项目中的 public async Task OnGetAsync(string? returnUrl = null)
上放置断点时,奇怪的事情发生了。
每次我们想在浏览器中访问https://localhost:5001/
,都会触发Login.cshtml.cs
中的断点。甚至在 ProjectRoot/Pages/Index.cshtml.cs
.
之前
我们怎样才能找到它为什么会这样?为什么应用程序在 Index.cshtml.cs
之前路由到 Login.cshtml.cs
?
在登录断点调试时,上下文值为:
Request.Path = "/"
Request.RouteValues = { ["page"] = "/Index" }
我认为你每次都被重定向到登录,因为你没有登录。这可以解释这种情况。
然后你在调试 'Login' 而你认为你在调试 'Index',这可能会非常混乱。
这也发生在我身上,你认为你正在调试一个请求,但事实证明你正在调试另一个请求(在我的例子中,我实际上是在调试一个发送给 'favicon.ico' 的请求,VS 发送在我不知情的情况下)。
在我们的一个项目 (.NET 5) 中,Razor 页面路由的行为有点奇怪。中间件管道没有什么特别的:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); });
}
甚至服务也不包含任何额外内容:
public void ConfigureServices(IServiceCollection services)
{
string connectionString = Configuration.GetConnectionString("DefaultConnection");
// for scoped services (mainly for identity)
services.AddDbContext<DbEntities>(options =>
options.UseSqlServer(connectionString));
AddIdentity(services);
services.AddDatabaseDeveloperPageExceptionFilter();
services.AddRazorPages()
.AddRazorRuntimeCompilation();
}
private void AddIdentity(IServiceCollection services)
{
services.AddDefaultIdentity<ApplicationUser>(options =>
{
options.SignIn.RequireConfirmedAccount = true;
options.User.RequireUniqueEmail = true;
options.Password.RequiredLength = 6;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireDigit = false;
options.Password.RequireLowercase = false;
options.Password.RequireUppercase = false;
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
})
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<DbEntities>();
// this is needed because passwords are stored with old hashes
services.Configure<PasswordHasherOptions>(options =>
options.CompatibilityMode = PasswordHasherCompatibilityMode.IdentityV2
);
}
我们搭建了一些身份 RazorPages:
当我们在 ProjectRoot/Areas/Identity/Pages/Account/Login.cshtml.cs
和 运行 项目中的 public async Task OnGetAsync(string? returnUrl = null)
上放置断点时,奇怪的事情发生了。
每次我们想在浏览器中访问https://localhost:5001/
,都会触发Login.cshtml.cs
中的断点。甚至在 ProjectRoot/Pages/Index.cshtml.cs
.
我们怎样才能找到它为什么会这样?为什么应用程序在 Index.cshtml.cs
之前路由到 Login.cshtml.cs
?
在登录断点调试时,上下文值为:
Request.Path = "/"
Request.RouteValues = { ["page"] = "/Index" }
我认为你每次都被重定向到登录,因为你没有登录。这可以解释这种情况。
然后你在调试 'Login' 而你认为你在调试 'Index',这可能会非常混乱。
这也发生在我身上,你认为你正在调试一个请求,但事实证明你正在调试另一个请求(在我的例子中,我实际上是在调试一个发送给 'favicon.ico' 的请求,VS 发送在我不知情的情况下)。