.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 发送在我不知情的情况下)。