使用HttpContext.Session和use.Session()时出现System.InvalidOperationException组

时间:2019-11-29 11:48:57

标签: c# asp.net-core

我正在为研究中的项目使用Razor页面开发.NET Core 3.0应用程序。该应用程序将使用登录功能,我想使用会话发送数据并验证登录的用户。

为此,我决定使用HttpContext.Session在发布期间获取和设置字符串。

当我使用以下行时:HttpContext.Session.SetString("username", "test");

我收到错误消息:System.InvalidOperationException: 'Session has not been configured for this application or request.'

经过广泛的谷歌搜索并使用Microsoft doc之后,我似乎找不到解决方案。在任何地方,我都得到需要在我的Startup.cs文件中包括services.AddSessionapp.UseSession();的答案,这些答案都添加在'UseMvc();'之前。行。

我用尽了所有选项,我的软件老师除了我认为根据Microsoft文档所做的“您使用的版本是否正确”外,不希望给我任何帮助。

我缺少什么导致此错误?我怎样才能使会议工作?我执行错了吗?

下面是我的Startup.cs类:

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

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDistributedMemoryCache();
            services.AddRazorPages();
            services.AddSession(options =>
            {
                options.Cookie.HttpOnly = true;
                options.Cookie.IsEssential = true;
                options.IdleTimeout = TimeSpan.FromSeconds(10);
            });
            services.AddMvc(option => option.EnableEndpointRouting = false);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
            }

            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
            });

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseSession();

            app.UseMvc();
        }
    }

值得注意的是,我在两次之间使用app.UseHttpContextItemsMiddleware(); app.UseSession();app.UseMvc();我收到一个Intellisense错误,提示IApplicationBuilder没有此方法。在Microsoft文档中,表明此字符串包含在Startup.cs中。

1 个答案:

答案 0 :(得分:1)

  

在任何地方,我都会得到包含services.AddSession和app.UseSession();所需的答案。在我执行的Startup.cs文件中,这些都添加在“ UseMvc();”之前行。

是的,您是对的。但是,请调用UseMvc()或调用UseRouting() + UseEndpoints(),但不要同时调用它们。从ASP.NET 3.0开始,我建议您应使用UseRouting() + UseEndpoints()而不是UseMvc()

在您的原始代码中,UseEndpoints()UseSession()之前触发,这使得MVC / Razor Page在UseSession()之前执行。要解决此问题,请按如下所示更改代码:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    // put UseSession before the line where you want to get the session. 
    // at least, you should put it before `app.UseEndpoints(...)`
    app.UseSession();     

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
        // if you need mvc, don't forget to 
        //      add `services.AddControllersWithViews` 
        //      and add this line
        endpoints.MapControllerRoute(
            name: "default-controller",
            pattern: "{controller=Home}/{action=Index}/{id?}"); 
    });

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseSession();

    app.UseMvc();    
}