我正在为研究中的项目使用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.AddSession
和app.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中。
答案 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();}