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

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中配置相同存储作为会话提供方:
    // .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";
    }
    
    配置完成后,两边会话数据会同步到同一存储介质,ASP.NET MVC 4.8即可通过原生Session对象读取ASP.NET Core写入的数据(注意保持键名一致)。

自定义状态提供者实现(无共享存储时)

若无法共享存储,可在ASP.NET MVC 4.8中实现自定义状态提供者,通过调用.NET 8 REST API获取状态:

  1. 实现自定义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等其他必要方法
    }
    
  2. 注册自定义提供者:
    在web.config中配置会话状态使用自定义提供者:
    <system.web>
        <sessionState mode="Custom" customProvider="ApiSessionStateProvider">
            <providers>
                <add name="ApiSessionStateProvider" type="你的命名空间.ApiSessionStateProvider, 你的程序集名称" />
            </providers>
        </sessionState>
    </system.web>
    
    同时在.NET 8 API中暴露会话查询接口,确保两个应用的Cookie域名一致,以正确传递会话ID。

内容的提问来源于stack exchange,提问作者Wasyster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:23:20