在 .NET 8 和 .NET Standard 2.0 之间处理 HttpContext.Session

问题描述 投票:0回答:1

比方说,.NET 标准 2.0 项目中有一个类,该类包含 HttpContext 的方法参数。该类将在.NET 8项目中引用。 这两个项目都使用 Microsoft.Aspnetcore.SystemWebAdapters NuGet。 在 .NET 8 中,HttpContext 在 IHttpContextAccessor 的帮助下使用,并且 context.Session 的类型为 ISession。 我将向该上下文的会话添加一些键。 现在,我必须从 .NET 标准 2.0 调用类方法。当 context 对象以 .NET 标准传递时,context.Session 为 null,因为它引用 System.Web 命名空间,因此 session 属性为 null。

有人可以用小型 POC 解释一下在这种情况下处理会话吗? 预先感谢。

我尝试在.NET 8中创建httpcontextwrapper类继承System.Web,以便使用包装器类将上下文转换为System.Web

这个方法行不通。

c# .net asp.net-core wcf httpcontext
1个回答
0
投票

在 .net 框架中,会话是使用 System.Web 进行管理的。在 ASP.NET Core 中,它们位于 Microsoft.AspNetCore.Http 下,具有不同的处理方式。由于将 HttpContext 从 .NET 8 传递到 .NET 2.0 库时存在这种差异,会话将显示为 null。为了满足您的要求,您可以尝试使用 Microsoft.AspNetCore.SystemWebAdapters 创建一个适配器,将现代 HttpContext 转换为模仿 System. Web,允许图书馆访问会话数据。

以下是示例代码:

程序.cs:

using LegacyLibrary;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Web;
using WebApplication5;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor();
builder.Services.AddDistributedMemoryCache(); // Add memory cache for session storage
builder.Services.AddSession(); // Add session services

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseSession(); // Session must be enabled before accessing it

app.UseAuthorization();

app.Use(async (context, next) =>
{
    context.Session.SetString("MyKey", "MyValue");

    // Test reading the value back
    var testValue = context.Session.GetString("MyKey");
    Console.WriteLine($"Session value for 'MyKey': {testValue}");

    await next();
});


app.MapGet("/", async (IHttpContextAccessor httpContextAccessor) =>
{
    var legacyHandler = new LegacyHandler();

    // Adapt the current HttpContext to System.Web.HttpContextBase
    var httpContext = httpContextAccessor.HttpContext;
    var adaptedContext = new CustomHttpContextAdapter(httpContext!);

    // Pass the adapted context to the legacy handler
    legacyHandler.ProcessRequest(adaptedContext);

    await httpContext.Response.WriteAsync("Processed successfully.");
});


app.Run();

自定义HttpContextAdapter.cs:

using System.Web;

namespace WebApplication5
{
    public class CustomHttpContextAdapter : HttpContextBase
    {
        private readonly Microsoft.AspNetCore.Http.HttpContext _coreContext;

        public CustomHttpContextAdapter(Microsoft.AspNetCore.Http.HttpContext coreContext)
        {
            _coreContext = coreContext;
        }

        public override HttpSessionStateBase Session
        {
            get
            {
                // You need to create a custom HttpSessionStateBase that wraps ASP.NET Core's ISession.
                return new CustomSessionStateAdapter(_coreContext.Session);
            }
        }

        // Implement other members of HttpContextBase if needed
    }

    public class CustomSessionStateAdapter : HttpSessionStateBase
    {
        private readonly ISession _session;

        public CustomSessionStateAdapter(ISession session)
        {
            _session = session;
        }

        public override object this[string name]
        {
            get
            {
                return _session.GetString(name);
            }
            set
            {
                _session.SetString(name, value.ToString());
            }
        }

        // You can implement other members as needed
    }

}

LegacyHandler.cs:

using System;
using System.Web;

namespace LegacyLibrary
{
    public class LegacyHandler
    {
      
        public void ProcessRequest(HttpContextBase context)
        {
            if (context.Session != null)
            {
                string value = context.Session["MyKey"] as string;
            
            }
            else
            {
                throw new InvalidOperationException("Session is null.");
            }
        }
    }

}

安装

Microsoft.AspNetCore.SystemWebAdapters
nuget包

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.