.NET 8与.NET Standard 2.0间HttpContext.Session跨版本处理方案问询
.NET Standard 2.0 与 .NET 8 跨项目 HttpContext 会话共享 POC
1. .NET Standard 2.0 项目代码
创建类库项目,引用System.Web依赖,编写依赖System.Web.HttpContext的业务类:
using System.Web; namespace LegacyLibrary { public class LegacySessionService { public string GetSessionValue(HttpContext context, string key) { return context.Session?[key]?.ToString(); } public void SetSessionValue(HttpContext context, string key, string value) { context.Session[key] = value; } } }
2. .NET 8 Web 项目配置与代码
2.1 安装NuGet包
安装与.NET 8版本匹配的Microsoft.AspNetCore.SystemWebAdapters包:
Install-Package Microsoft.AspNetCore.SystemWebAdapters -Version 8.0.x
2.2 配置Program.cs
在Program.cs中依次配置Session、SystemWebAdapters服务及中间件:
var builder = WebApplication.CreateBuilder(args); // 配置ASP.NET Core Session builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; }); // 添加SystemWebAdapters服务并启用Session适配 builder.Services.AddSystemWebAdapters() .AddSessionAdapter(); // 注册HttpContextAccessor builder.Services.AddHttpContextAccessor(); builder.Services.AddControllersWithViews(); var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 启用Session中间件(必须在UseSystemWebAdapters之前) app.UseSession(); // 启用SystemWebAdapters中间件 app.UseSystemWebAdapters(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
2.3 调用Legacy服务的示例代码
在Controller中注入依赖,完成HttpContext转换并调用Legacy方法:
using LegacyLibrary; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Http; using System.Web; namespace Net8WebApp.Controllers { public class HomeController : Controller { private readonly IHttpContextAccessor _httpContextAccessor; private readonly LegacySessionService _legacyService; public HomeController(IHttpContextAccessor httpContextAccessor, LegacySessionService legacyService) { _httpContextAccessor = httpContextAccessor; _legacyService = legacyService; } public IActionResult Index() { // 1. 在ASP.NET Core Session中设置值 var coreContext = _httpContextAccessor.HttpContext; coreContext.Session.SetString("CoreKey", "CoreSessionValue"); // 2. 用官方适配方法转换为System.Web.HttpContext var systemWebContext = coreContext.Adapt<HttpContext>(); // 3. 调用Legacy服务操作Session _legacyService.SetSessionValue(systemWebContext, "LegacyKey", "LegacySessionValue"); var legacyValue = _legacyService.GetSessionValue(systemWebContext, "LegacyKey"); var coreValueFromLegacy = _legacyService.GetSessionValue(systemWebContext, "CoreKey"); // 验证会话互通 ViewBag.LegacySessionValue = legacyValue; ViewBag.CoreValueFromLegacy = coreValueFromLegacy; ViewBag.CoreValueDirect = coreContext.Session.GetString("CoreKey"); return View(); } } }
关键注意事项
- 不要自行实现
HttpContextWrapper,官方适配库已内置完整的上下文映射逻辑,包括Session的双向同步。 - 中间件启用顺序必须是
UseSession()在前,UseSystemWebAdapters()在后,否则会话无法正确映射。 - 转换HttpContext必须使用官方提供的
Adapt<HttpContext>()扩展方法,这是适配逻辑的入口。
内容的提问来源于stack exchange,提问作者tony
相关产品推荐
相关产品推荐

