ASP.NET MVC(.NET4.8)迁移至.NET8后访问Core会话或自定义会话提供者方法
问题解答
通用访问方案:共享会话存储
不存在跨框架的原生API让ASP.NET MVC 4.8直接读取ASP.NET Core 8的会话状态,但可以通过共享底层会话存储介质实现数据互通:
- 选择双方兼容的分布式存储(如Redis、SQL Server),作为会话数据的统一存储源
- 在ASP.NET Core 8中配置会话使用该存储:
// .NET 8 Program.cs builder.Services.AddStackExchangeRedisCache(options => { options.Configuration = "你的Redis连接字符串"; }); builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; }); app.UseSession(); - 在ASP.NET MVC 4.8中配置相同存储作为会话提供方:
配置完成后,两边会话数据会同步到同一存储介质,ASP.NET MVC 4.8即可通过原生// .NET 4.8 Global.asax.cs protected void Application_Start() { // 需先安装Microsoft.Web.RedisSessionStateProvider包 RedisSessionStateProvider.SetConnectionString("你的Redis连接字符串"); var sessionState = (SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState"); sessionState.Mode = SessionStateMode.Custom; sessionState.CustomProvider = "RedisSessionStateProvider"; }Session对象读取ASP.NET Core写入的数据(注意保持键名一致)。
自定义状态提供者实现(无共享存储时)
若无法共享存储,可在ASP.NET MVC 4.8中实现自定义状态提供者,通过调用.NET 8 REST API获取状态:
- 实现自定义SessionStateProvider:
继承SessionStateStoreProviderBase,重写核心方法,在方法内调用.NET 8 API获取会话数据:public class ApiSessionStateProvider : SessionStateStoreProviderBase { public override SessionStateStoreData GetItem(HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { locked = false; lockAge = TimeSpan.Zero; lockId = null; actions = SessionStateActions.None; // 调用.NET 8 API获取会话数据 using (var client = new HttpClient()) { client.BaseAddress = new Uri("你的.NET8 API域名/"); var response = client.GetAsync($"api/session/{id}").Result; if (response.IsSuccessStatusCode) { var sessionData = response.Content.ReadAsAsync<Dictionary<string, object>>().Result; var serializer = new BinaryFormatter(); using (var ms = new MemoryStream()) { serializer.Serialize(ms, sessionData); ms.Position = 0; return new SessionStateStoreData(new SessionStateItemCollection(ms), SessionStateUtility.GetSessionStaticObjects(context), 30); } } } return null; } // 按需重写SetItem、ReleaseItemExclusive等其他必要方法 } - 注册自定义提供者:
在web.config中配置会话状态使用自定义提供者:
同时在.NET 8 API中暴露会话查询接口,确保两个应用的Cookie域名一致,以正确传递会话ID。<system.web> <sessionState mode="Custom" customProvider="ApiSessionStateProvider"> <providers> <add name="ApiSessionStateProvider" type="你的命名空间.ApiSessionStateProvider, 你的程序集名称" /> </providers> </sessionState> </system.web>
内容的提问来源于stack exchange,提问作者Wasyster
相关产品推荐
相关产品推荐

