我正在将一个大型项目从 .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> 我的整个代码库访问当前会话信息。
如有需要,我很乐意提供任何其他信息。
提前致谢!
您使用了静态变量
static public HttpContext WebContext { get; set; }
;这在某种程度上等于单例生命周期。builder.Services.AddSingleton<WebData>();
builder.Services.AddScoped<WebData>();
这种服务寄存器模式用于依赖注入,这不适用于静态方法或类。所以
IHttpContextAccessor httpContextAccessor
根本不会发射。