使用 SQL 服务器会话状态保存后会话值为 NULL

Session Value is NULL after saving it using SQL Server Session State

我最近将我的应用程序转换为使用会话状态“SQL 服务器”而不是“InProc”,因为我必须对第三方应用程序进行一些重定向。一切正常,我可以轻松设置和检索会话值。当我尝试从不同的控制器方法再次访问会话时出现问题

结构是这样的:

添加公司方法

public String AddNewCompany()
    {
       SalesInvoiceSettingController invoiceSetting = new SalesInvoiceSettingController();
       string Uname = Session["UserName"].ToString(); // This session value is picked correctly
     
     invoiceSetting.SaveInvoiceSettings(); // This is another method which I am calling inside this method, by creating an object of 'SalesInvoiceSettingController'

SaveInvoiceSettings 方法

 public string SaveInvoiceSettings()
    {
        
        string Uname = Session["UserName"].ToString(); <-- This is where I get a NULL POINTER EXCEPTION i.e Object Reference not set to an instance of an object.

不确定我做错了什么?它可以从一个控制器的方法访问,但不能从不同控制器的方法访问。谁能帮我解决这个问题?

好的,我终于找到了发生这种情况的原因。基本上根据框架,当您创建一个 Instance 时,它​​并没有真正完全初始化它(即没有会话、请求等)被初始化,但实际上是 'Injected' 稍后在流程生命周期中。为了解决这个问题,我们需要手动初始化它。解决方案如下:

考虑两个控制器:

  • 控制器A(创建'Controller B'实例的控制器)。
  • 控制器 B

首先,您需要像这样在控制器 B 中创建一个初始化方法:

控制器 B

  Public class ControllerB : Controller
{
    public void InitializeController(RequestContext requestContext)
    {
        base.Initialize(requestContext);
       
    }
   }

现在,在控制器 A 中创建控制器 B 的实例并调用此方法:

控制器A

Public Class ControllerA : Controller
 {
   ControllerB obj1 = new ControllerB();
   obj1.InitializeController.InitializeController(this.Request.RequestContext);
  }

你很高兴去。您将拥有所有会话的完全访问权限。 感谢 nikki9696 为我指明了正确的方向。