You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 3.0 Razor Pages使用HttpContext.Session触发InvalidOperationException

解决.NET Core 3.0 Razor Pages中Session未配置的问题

你的问题核心出在中间件的执行顺序错误,这是Session无法正常初始化的主要原因。另外你提到的UseHttpContextItemsMiddleware()在.NET Core 3.0+版本中已经被移除,所以不需要添加。下面一步步帮你修正:

一、核心问题分析:中间件顺序混乱

在ASP.NET Core中,中间件的执行顺序直接决定了功能是否正常工作。你的Configure方法里存在多个顺序错误和重复调用:

  • app.UseSession()被放在了app.UseEndpoints()、app.UseMvc()之后,导致依赖Session的组件无法获取到Session服务
  • app.UseHttpsRedirection()位置靠后,应该优先处理HTTPS重定向
  • 重复调用了app.UseStaticFiles(),没有必要
  • 同时混用了Endpoint Routing(UseEndpoints)和传统Mvc路由(UseMvc),容易引发冲突

二、修正后的Startup.cs代码

下面是调整后的完整代码,我会标注关键修改点:

public class Startup {
    public Startup(IConfiguration configuration) {
        Configuration = configuration;
    }
    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services) {
        // 1. 先添加分布式内存缓存(Session依赖它)
        services.AddDistributedMemoryCache();
        
        // 2. 添加Session服务(建议放在Razor Pages/Mvc之前)
        services.AddSession(options => {
            options.Cookie.HttpOnly = true;
            options.Cookie.IsEssential = true;
            options.IdleTimeout = TimeSpan.FromSeconds(10);
        });
        
        // 3. 添加Razor Pages服务
        services.AddRazorPages();

        // 如果你不需要传统Mvc控制器,建议移除下面这行
        // services.AddMvc(option => option.EnableEndpointRouting = false);
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
        if (env.IsDevelopment()) {
            app.UseDeveloperExceptionPage();
        } else {
            app.UseExceptionHandler("/Error");
            app.UseHsts(); // 生产环境建议启用HSTS
        }

        // 优先处理HTTPS重定向
        app.UseHttpsRedirection();
        // 处理静态文件(只需要调用一次)
        app.UseStaticFiles();

        // 4. 关键:Session中间件必须放在路由、授权、端点之前!
        app.UseSession();

        // 路由中间件
        app.UseRouting();
        // 授权中间件
        app.UseAuthorization();

        // 配置Razor Pages端点(.NET Core 3.0+推荐的方式)
        app.UseEndpoints(endpoints => {
            endpoints.MapRazorPages();
        });

        // 如果你保留了AddMvc,UseMvc要放在UseSession之后,但建议用上面的Endpoints方式替代
        // app.UseMvc();
    }
}

三、关键修改说明

  1. Session中间件顺序:app.UseSession()必须在app.UseRouting()、app.UseAuthorization()、app.UseEndpoints()之前注册,这样后续依赖Session的组件才能正确访问Session服务。
  2. 移除不必要的代码:
    • 重复的app.UseStaticFiles()调用直接删除
    • UseHttpContextItemsMiddleware()在.NET Core 3.0及以后版本中已被移除,微软旧文档可能未更新,无需添加
    • 如果你只开发Razor Pages应用,完全可以移除AddMvc和UseMvc,AddRazorPages()已经包含了所需的基础服务
  3. HTTPS重定向位置:app.UseHttpsRedirection()放在最前面(异常页之后),确保所有请求先重定向到HTTPS,提升安全性。

四、测试验证

修改完成后,重新启动应用,再执行HttpContext.Session.SetString("username", "test")就不会再触发Session has not been configured的错误了。

内容的提问来源于stack exchange,提问作者Maarten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:51:40