罕见的System.NullReferenceException显示以前填充的HttpContext.Current.Session [“courseNameAssociatedWithLoggedInUser”]?

时间:2013-03-18 17:32:21

标签: asp.net silverlight session session-variables nullreferenceexception

我们的ASP.NET C#Web应用程序用于以下环境

  • .NET Framework 4
  • Silverlight 4 / PivotViewer
  • IIS 7
  • Windows 2008
  • Visual Studio 2010 .NET IDE
  • C#
  • HTTPS(SSL)

我们的Silverlight 4 / PivotViewer控件显然是嵌入式的 ASP.NET页面。

在极少数情况下,我们会将“对象引用设置为未设置的实例” 一个东西。浏览托管我们的ASP.NET页面时出错 我们的独立Windows 2008上的Silverlight 4 / PivotViewer模块 IIS 7的服务器。

此外,错误还有很多奇怪的事情。首先,它 有时仅在某些用户计算机上发生。详细说明一下 通常仅在用户第一次使用访问我们的ASP.NET Web应用程序的计算机时才会发生。

此外,一旦我们清除了浏览器缓存,就不会发生错误 在导航我们的ASP.NET页面时导航 Silverlight 4 / PivotViewer模块。

关于错误的另一个有趣的方面是它指的是 错误堆栈中本地开发计算机上的绝对路径 在实际部署到独立Windows 2008时进行跟踪 使用IIS 7的服务器。这真的很奇怪,因为在我部署之前 使用IIS 7的独立Windows 2008服务器,我确保所有 文件中的配置参数如web.config引用 独立服务器环境。换句话说,我删除任何 引用与本地关联的配置参数值 开发计算机。

因此,我很困惑为什么它指的是我的绝对路径 错误堆栈跟踪中的本地开发计算机。

用户获取“对象引用”的经验会很糟糕 在使用网站时未设置为对象的实例。它,它 如果我们必须告诉用户清除,那将是糟糕的用户体验 每当错误出现时,他/她的浏览器缓存。

  '/'应用程序中的服务器错误。   你调用的对象是空的。   描述:执行期间发生未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

     

异常详细信息:System.NullReferenceException:不是对象引用   设置为对象的实例。

     

来源错误:   在执行期间生成了未处理的异常   当前的网络请求。有关的来源和位置的信息   可以使用下面的异常堆栈跟踪来识别异常。

     

堆栈追踪:

     

[NullReferenceException:对象引用未设置为对象的实例。]      PivotServer.SectionBasedRelatedModules.SectionBasedPerlsViewer.tailorConfigurationDetailsOfPageElementsToFallInLineWithTutorialSelection()   在C:\ VisualStudioWorkSpace \ VisualCSharpProjects \ PerlsPivot \ PivotServer \ SectionBasedRelatedModules \ SectionBasedPerlsViewer.aspx.cs:160      PivotServer.SectionBasedRelatedModules.SectionBasedPerlsViewer.Page_Load(对象   发件人,EventArgs e)in   C:\ VisualStudioWorkSpace \ VisualCSharpProjects \ PerlsPivot \ PivotServer \ SectionBasedRelatedModules \ SectionBasedPerlsViewer.aspx.cs:146      System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp,   Object o,Object t,EventArgs e)+24      System.Web.UI.Control.LoadRecursive()+70      System.Web.UI.Page.ProcessRequestMain(布尔   includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)   3063

     

版本信息:Microsoft .NET Framework版本:4.0.30319;   ASP.NET版本:4.0.30319.272

我查看第160行,其中包含以下代码:

String coursename = HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"].ToString();

显然,这告诉我们HttpContext.Current.Session中的变量“courseNameAssociatedWithLoggedInUser”没有值。

但是,我在另一台计算机上采取了相同的步骤,但一切顺利。 另外,我确信一旦用户登录,我就会给HttpContext.Current.Session [“courseNameAssociatedWithLoggedInUser”]一个值。

HttpContext.Current.Session [“courseNameAssociatedWithLoggedInUser”]是否因某种原因被破坏了?如果是这样,为什么,我们如何防止它?

我应该使用Page.Session而不是HttpContext.Current.Session吗?那会有帮助吗?

3 个答案:

答案 0 :(得分:3)

  

“显然,这告诉我们变量”courseNameAssociatedWithLoggedInUser“中没有值   HttpContext.Current.Session“。

不完全......给出你的代码......

String coursename = HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"].ToString();

......以下项目可能导致此

  • HttpContext - 不太可能
  • HttpContext.Current - 比你想象的更频繁,但是可以重现
  • HttpContext.Current.Session [“courseNameAssociatedWithLoggedInUser”]

要找出该链中的特定项目,您可以执行类似的操作(伪代码)

function string GetCourseNameThingie()
{
  if HttpContext is null
    throw new Exception("HttpContext is null")
  if HttpContext.Current is null
    throw new Exception("HttpContext.Current is null")
  if HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"] is null
    throw new Exception("HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"]is null")

   return HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"].ToString()
}

这会告诉你具体缺少什么。正如我们已经指出的那样,该值更有可能被另一个页面清除,或者发生的错误严重到足以破坏该用户的会话(你在Global.asax中有一个Application_Error或Session_End处理程序吗?)。

您还可以尝试在try / catch中包装原始语句,如果发生异常,请立即检查您认为仍在工作的另一个会话变量。这也将告诉您确定其他变量是否正常。

答案 1 :(得分:1)

首先,对不起我的语法 - 英语。

我的.net应用程序遇到类似的问题,原因是空闲时间到期。

有四个时间到期设置"(是4)"以及应用程序池的回收过程。我做了以下

A)从应用程序池中:打开高级设置并更改" 空闲时间"。默认为20分钟。

另外,设置" 常规时间间隔"为0.所以它不会被回收。我不知道为什么微软决定将此默认为1740分钟。这不是超时设置,它是一段时间后总是回收appPool的设置,所以如果你的用户处于中间状态,他们将失去一切或者有你所拥有的异常。将其设置为0将禁用此功能。

B)认证超时。如果您正在使用它,例如表单身份验证,则转到虚拟目录应用程序的身份验证功能,右键单击"表单身份验证"并选择"编辑"。更改身份验证Cookie-time out

C)ASP.NET会话状态。在ISS中,打开.net会话状态功能并更改会话超时。默认情况下也是20分钟。

D)asp.net表单身份验证超时。这对我来说很困惑,因为我已经在IIS中修改了表单身份验证的cookie时间(步骤B)。所以当我意识到我还需要更改 web.config表单身份验证标记以添加超时属性来更改默认值时,我仍然遇到了一些问题。分钟。

我的标签看起来像这样:...表格名称=" .ASPXFORMSAUTH"路径=" /" loginUrl =" frmLogin.aspx" 超时=" 1740" 保护="全部" ...

我们开发了一种javascript机制,可以将会话状态设置为超时设置,因此我们会向用户表示系统即将因不活动而自动注销。

它现在很漂亮,基本上我把所有的时间都设置为" 1740"分钟,除了我们设置为30分钟的会话状态。因此,在不活动的第29分钟,我们向用户显示系统将在一分钟内自动注销,除非他们执行某些活动,因此空闲时间再次从0开始。很棒,现在我们对会话没有任何问题。

无论如何,我告诉过你我们的经验以及我们如何解决你现在遇到的类似问题。但是,我在这里结束的原因是因为我们还希望在任何异常时消除本地开发计算机上对绝对路径的引用

我们还没弄清楚它为何显示绝对路径。我们已经在发布模式下编译了我们的DLL程序集,但这并没有改变任何东西。有人帮您解决这个问题?????

谢谢你们

答案 2 :(得分:1)

引用ViewModel中的会话

您可能没有使用ASP.net MVC,但如果有人要寻找答案,这将非常有用。

我处于完全相同的情况,除非我每次都会收到null异常,而我的同事根本没有,即使我们运行完全相同的代码。

我们的错误是从ViewModel引用会话变量,这显然是不好的做法。代码已更改,以便ViewModel通过控制器接收会话内容,然后将其设置为ViewModel的属性。会话数据(我的例子叫做ProcessingWeek)将使用this.ProcessingWeek,而不是直接查看httpcontext.current.session [" ProcessingWeek"]。

EventMatchResult Match = new EventMatchResult(
      (ImportedEventModel)SessionData.ImportedEventModel,
      ref db,
      SessionData.ProcessingWeek);

...

public EventMatchResult(ImportedEventModel Event, ref CFModel db, 
                                                   int ProcessingWeek)
    {
        this.db = db;
        this.MatchedField = new List<PlayerMatchResult>();
        this.ImportedEvent = Event;
        this.ProcessingWeek = ProcessingWeek;
    }
相关问题