C# 使用SQL Server会话状态保存会话值后,会话值为空
我最近将我的应用程序转换为使用会话状态“SQL Server”而不是“InProc”,因为我必须重定向到第三方应用程序。一切正常,我可以轻松设置和检索会话值。当我尝试从不同的控制器方法再次访问会话时,就会出现问题 这就是它的结构: 添加公司方法C# 使用SQL Server会话状态保存会话值后,会话值为空,c#,sql-server,session-state,C#,Sql Server,Session State,我最近将我的应用程序转换为使用会话状态“SQL Server”而不是“InProc”,因为我必须重定向到第三方应用程序。一切正常,我可以轻松设置和检索会话值。当我尝试从不同的控制器方法再次访问会话时,就会出现问题 这就是它的结构: 添加公司方法 public String AddNewCompany() { SalesInvoiceSettingController invoiceSetting = new SalesInvoiceSettingController();
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'
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.
SaveInvoiceSettings方法
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'
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.
公共字符串SaveInvoiceSettings()
{
string Uname=Session[“UserName”]。ToString();好的,所以我终于找到了发生这种情况的原因。基本上按照框架,当您创建一个实例时,它实际上并没有完全初始化它(即没有会话、请求等)已初始化,但实际上已在流程生命周期的后期“注入”。为了解决此问题,我们需要手动对其进行初始化。解决方案如下所示:
考虑两个控制器:
- 控制器A(创建“控制器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为我指明了正确的方向。你正在另一个控制器中创建一个控制器实例?为什么?更好的设计是让他们共享一个业务层对象。我不确定这是否是原因,但你在生命周期中更新一个控制器会做与框架不同的事情工作就是这样吗?我能理解这里的设计缺陷。但我不能理解的是,为什么会出现这个问题?可能是实例导致了问题吗?可能。我不确定您是如何实例化控制器的,但可能是框架处理了会话状态,并在创建e控制器,但不是当您这样做时,因为您没有传递它来自的上下文。啊,这看起来很有趣。也许您可以设置httpcontext并传递该会话way@Nikki9696...你是个救命恩人。这帮了大忙。我也在下面贴出了答案。:)