我对 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");
}
我不知道为什么会发生或者这个错误到底意味着什么。 有人可以解释一下这可能是什么原因造成的吗?
在您的 Startup.cs 中,您可能需要调用
app.UseSession 在 app.UseMvc 之前
app.UseSession();
app.UseMvc();
为此,您还需要确保安装了 Microsoft.AspNetCore.Session nuget 包。
更新
你不需要使用app.UseMvc();在 .NET Core 3.0 或更高版本中
以下代码对我有用:
配置服务:
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?}");
});
}
我在 .NET Core 3.0 Razor Pages 应用程序中遇到了完全相同的错误。因为,我没有使用
app.UseMvc()
建议的答案对我不起作用。
因此,对于在 .NET Core 3.0 中遇到相同问题的任何人,以下是我在
Configure
中所做的操作以使其正常工作:
app.UseSession(); // use this before .UseEndpoints
app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); });
适用于.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);
如果您使用 .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();
对于 .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();});
}
如果您遇到此问题并且您的启动设置正确:当我忘记等待并使用注入的 IHttpContextAccessor 的异步方法时,就会出现此错误。通过在调用中添加等待,问题得到解决。
HttpContext.Session.Add("name", "value");
或
HttpContext.Session["username"]="Value";