万金流
以码会友。 吾Q:578751655。 水平有限,轻喷,谢!

为了减小体积,core默认包含的东西比较少。MVC模板里默认没有包含Session。

以下内容VS2022版本 17.2.4调试通过。

添加方法:

在主程序(Program.cs)里添加session的有关设置和管道中间件

 1 public class Program
 2     {
 3         public static void Main(string[] args)
 4         {
 5             var builder = WebApplication.CreateBuilder(args);
 6 
 7             // Add services to the container.
 8             builder.Services.AddControllersWithViews();
 9 
10             builder.Services.AddDistributedMemoryCache();
11 
12             builder.Services.AddSession(options =>
13             {
14                 options.IdleTimeout = TimeSpan.FromMinutes(20);
15                 options.Cookie.Name = "test";
16             });
17 
18             var app = builder.Build();
19 
20             // Configure the HTTP request pipeline.
21             if (!app.Environment.IsDevelopment())
22             {
23                 app.UseExceptionHandler("/Home/Error");
24             }
25             app.UseStaticFiles();
26 
27             app.UseRouting();
28 
29             app.UseAuthorization();
30 
31             app.UseSession();
32 
33             app.MapControllerRoute(
34                 name: "default",
35                 pattern: "{controller=Home}/{action=Index}/{id?}");
36 
37             app.Run();
38         }
39     }

说明:

1、10-16行为设置并添加Session服务。第10行使用分布式缓存;第14行设置默认超时时间;第15行给Session起个名字,能防止同一主机多个网站Session混乱。

如果想全部使用默认值,可以直接简写为”builder.Services.AddSession();“

2、第31行使用Session中间件。位置一定要在UseRouting之后,Map之前。

至此,可以使用Session。 需要注意:

1、MVC里,控制器中的Session在“ControllerBase.HttpContext"中,访问方式为”HttpContext.Session“

2、对Session的读写,需要用规定的扩展方法:

3、对于webapi跨域使用session,有些限制。详见本博客关于跨域的内容(搜“关于跨域”可见)。

体会:前后端一体项目中,Session好用;分离(跨域),不好用。


 

举例:

一个简单的累加器,用户每访问页面一次,数字加一。

控制器:

 1 public class HomeController : Controller
 2     {
 3         public IActionResult Index()
 4         {
 5             var t=HttpContext.Session.GetInt32("sum")??-1;
 6             t++;
 7             HttpContext.Session.SetInt32("sum", t);
 8             ViewData["sum"] = t; 
 9             return View();
10         }
11     }

页面:

求和值为:@(ViewData["sum"]??"没有值")

运行效果:

 

不同Session,值互不干扰。

另:在页面上使用Session,可以用Context取代控制器里的HttpContext。两者指向同一对象。

 参考:

1、微软官方文档”https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state?view=aspnetcore-6.0“

2、微软官方文档”https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/http-context?view=aspnetcore-6.0“

 鸣谢:”.Virus.“,QQ:7327594;”FriskTale“,QQ:944208851

posted on 2022-06-16 15:38  万金流  阅读(1237)  评论(0编辑  收藏  举报