如何在 Asp.net MVC Core 7 中访问会话数据?

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

我正在将一个大型项目从 .net4.8 迁移到 .net7。

该解决方案基本上是一个名为 Investo 的小型 Web 核心项目,但它引用了一个名为 General 的大型项目。 99% 的逻辑都是通用的。

一般来说,我对一个名为 GetUserID 的函数进行了大量调用,该函数(在 asp.net 4.8 中)返回一个存储在

HttpContext.Current.Session
中的参数。可以使用 10 年,效果很好。

但是现在当我从 .net7 调用它时,它删除了

HttpContext.Current
,我无法弄清楚如何以任意代码访问状态。

我尝试将其存储在全局共享变量中,但它似乎随机被处理或其他随机错误。

这是我的程序的相关部分.cs

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpContextAccessor();
builder.Services.AddSession();
builder.Services.AddControllersWithViews();
builder.Services.AddSingleton<WebData>();
builder.Services.AddScoped<WebData>();
var app = builder.Build();

app.UseStaticFiles();
app.UseRouting();
app.UseSession();

Core.Options.PersonID = () =>
{
    var ses = WebData.CurSession();
    if (ses == null) return null;
    var sessionData = ses.GetString("WebSession");
    if (sessionData == null) return null;
    var ws = JsonConvert.DeserializeObject<WebSession>(sessionData);
    return ws.PersonID;
};

app.MapGet("/Global/InvokeFunction", (string Name, string JsonInput, HttpContext httpContext) =>
{
    //return WebFunctions.InvokeFunction(Name, JsonInput);
    //var a = new WebData();
    WebData.WebContext = httpContext;
    //if(WebData.WebContext ==null)   WebData.WebContext = httpContext;
    var uid = Core.Functions.GetUserID();
    var ret = Web.WebFunctions.InvokeFunction(Name, JsonInput);
    var json = Utils.Extensions.ToSafeJson(ret);
    return Results.Content(json, "application/json");
});

app.Run();

这是网络数据:

public class WebData
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public WebData(IHttpContextAccessor httpContextAccessor) {
        _httpContextAccessor = httpContextAccessor; // never fires
    }
     
    static public HttpContext WebContext { get; set; }
    static public ISession? CurSession() {
        var cx = WebContext;
        if (cx == null) return null; //OK. maybe background threads etc.
        try {
            var ses = cx.Session; //this often fails with "object reference not set to instance of an object". even if its a try-catch. 
            return ses;
        }
        catch (Exception ex) {
            if (!ex.Message.StartsWith("IFeat")) {
                var b = 1;//happens often can figure out rhyme or reason why and when it happens. sometimes works sometimes not
            }
            var a = ex;
        }
        return null;
    }
}

前 3 行(关于

IHttpContextAccessor
)是我添加的,因为我读到它应该以某种方式有所帮助,尽管事实上它永远不会触发。

请告知我如何通过

MapGet
> InvokeFunction> 我的整个代码库访问当前会话信息。

如有需要,我很乐意提供任何其他信息。

提前致谢!

asp.net-core session httpcontext
1个回答
0
投票

您使用了静态变量

static public HttpContext WebContext { get; set; }
;这在某种程度上等于单例生命周期。
所以你应该删除以下扰乱变量生命周期的代码。

builder.Services.AddSingleton<WebData>();
builder.Services.AddScoped<WebData>();

这种服务寄存器模式用于依赖注入,这不适用于静态方法或类。所以

IHttpContextAccessor httpContextAccessor
根本不会发射。

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