尚未为此应用程序配置会话或请求错误

问题描述 投票:0回答:9

我对 ASP.NET 非常陌生,最近我遇到了这个异常:

系统.InvalidOperationException

异常的详细信息如下:

尚未为此应用程序或请求配置会话。

这是发生这种情况的代码片段:

[HttpPost]
        public object Post([FromBody]loginCredentials value)
        {
            if (value.username.Equals("Admin")
                &&
                value.password.Equals("admin"))
            {
                HttpContext.Session.Set("userLogin", System.Text.UTF8Encoding.UTF8.GetBytes(value.username)); //This the line that throws the exception.
                return new
                {
                    account = new
                    {
                        email = value.username
                    }
                };
            }
            throw new UnauthorizedAccessException("invalid credentials");
        }

我不知道为什么会发生或者这个错误到底意味着什么。 有人可以解释一下这可能是什么原因造成的吗?

asp.net-mvc asp.net-web-api
9个回答
155
投票

在您的 Startup.cs 中,您可能需要调用

app.UseSession 在 app.UseMvc 之前

app.UseSession();  
app.UseMvc();  

为此,您还需要确保安装了 Microsoft.AspNetCore.Session nuget 包。

更新

你不需要使用app.UseMvc();在 .NET Core 3.0 或更高版本中


36
投票

以下代码对我有用:

配置服务:

    public void ConfigureServices(IServiceCollection services)
    {
          //In-Memory
          services.AddDistributedMemoryCache();
          services.AddSession(options => {
          options.IdleTimeout = TimeSpan.FromMinutes(1);
          });              
          // Add framework services.
          services.AddMvc();
     }

配置 HTTP 请求管道:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
                      ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();
    if (env.IsDevelopment())
    {
       app.UseDeveloperExceptionPage();
       app.UseBrowserLink();
    }
    else
    {
       app.UseExceptionHandler("/Home/Error");
    }
    app.UseStaticFiles();
    app.UseSession();
    app.UseMvc(routes =>
    {
        routes.MapRoute(
           name: "default",
           template: "{controller=Home}/{action=Index}/{id?}");
     });
 }

35
投票

对于 .NET 6:

首先转到您的

Program.cs
(在那里添加代码)

我将其插入到构建器的last部分:

builder.Services.AddSession();

我在

app.UseAuthorization();

之后添加了这个
app.UseSession();

最终输出:

enter image description here


注意:我不知道这是否真的是放置代码的“正确行”,但这对我有用。 (我还是 ASP.NET 的初学者)


21
投票

我在 .NET Core 3.0 Razor Pages 应用程序中遇到了完全相同的错误。因为,我没有使用

app.UseMvc()
建议的答案对我不起作用。

因此,对于在 .NET Core 3.0 中遇到相同问题的任何人,以下是我在

Configure
中所做的操作以使其正常工作:

app.UseSession(); // use this before .UseEndpoints
app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); });

6
投票

适用于.net core 5

应在startup.cs中添加以下几行

        services.AddDistributedMemoryCache();

        services.AddSession(options =>
        {
            options.IdleTimeout = TimeSpan.FromMinutes(10);
            options.Cookie.HttpOnly = true;
            options.Cookie.IsEssential = true;
        });

app.UseSession();
应添加在

之前
app.UseAuthentication();
app.UseAuthorization();

以下代码可用于设置值和读取值

this.httpContext.Session.SetString(SessionKeyClientId, clientID);
clientID = this.httpContext.Session.GetString(SessionKeyClientId);

5
投票

如果您使用 .NET 6,请将以下内容添加到您的

Program.cs
中(可能不适用于旧版本):

builder.Services.AddDistributedMemoryCache();

builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromSeconds(10);
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});

app.UseSession();

确保

builder
app
是否已声明。如果不是,请在我之前说过的内容之前添加以下内容:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

3
投票

对于 .NET5 中的 Razor Pages ASP.NET Core 应用程序(需要在较新的运行时上进行测试):

在ConfigureServices内的startup.cs中,我添加了services.AddSession()以注册会话服务

public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
**services.AddSession();** 
}

在配置方法中,我还添加了 app.UseSession() 以便为应用程序启用会话

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{app.UseDeveloperExceptionPage();}
else
{app.UseExceptionHandler("/Error");}
app.UseStaticFiles();
**app.UseSession();** 
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>{endpoints.MapRazorPages();});
}

1
投票

如果您遇到此问题并且您的启动设置正确:当我忘记等待并使用注入的 IHttpContextAccessor 的异步方法时,就会出现此错误。通过在调用中添加等待,问题得到解决。


-6
投票
HttpContext.Session.Add("name", "value");

HttpContext.Session["username"]="Value";
© www.soinside.com 2019 - 2024. All rights reserved.