You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 03:02:48