0

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

  • .NET 框架 4
  • Silverlight 4 / PivotViewer
  • IIS 7
  • 视窗 2008
  • Visual Studio 2010 .NET IDE
  • C#
  • HTTPS ( SSL )

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

在极少数情况下,我们在带有 IIS 7 的独立 Windows 2008 服务器上浏览承载 Silverlight 4 / PivotViewer 模块的 ASP.NET 页面时,会收到“对象引用未设置为对象的实例。错误。

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

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

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

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

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

“/”应用程序中的服务器错误。你调用的对象是空的。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

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

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

堆栈跟踪:

[NullReferenceException: 对象引用未设置为对象的实例。] C:\VisualStudioWorkSpace\VisualCSharpProjects\PerlsPivot\PivotServer\SectionBasedRelatedModules\SectionBasedRelatedModules.aspx.cs:160 PivotServer.SectionBasedRelatedModules.SectionBasedPerlsViewer.tailorConfigurationDetailsOfPageElementsToFallInLineWithTutorialSelection() .Page_Load(Object sender, 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(Boolean includeStagesBeforeAsyncPoint,布尔型 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 吗?那会有帮助吗?

4

3 回答 3

3

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

不完全是...给定您的代码...

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 中,如果发生异常,请立即检查您认为仍在工作的另一个会话变量。这也将明确告诉您其他变量是否正常。

于 2013-03-27T17:31:56.170 回答
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 表单身份验证标签以添加超时属性以更改默认 20 分钟时。

我的标签看起来像这样: ...forms name=".ASPXFORMSAUTH" path="/" loginUrl="frmLogin.aspx" timeout="1740" protection="All" ...

我们开发了一种 javascript 机制来设置会话状态超时,因此我们提醒用户系统将由于不活动而自动注销。

现在效果很好,基本上我已经将所有超时设置设置为“1740”分钟,除了我们设置为 30 分钟的会话状态。因此,在不活动的第 29 分钟,我们向用户显示系统将在一分钟内自动注销,除非他们进行一些活动,因此空闲时间再次从 0 开始。太棒了,现在我们对会话没有任何问题。

无论如何,伙计们,我已经告诉你我们的经验以及我们如何解决你现在遇到的类似问题。但是,我之所以到此结束,是因为我们也想在出现任何异常时消除对我本地开发计算机上的绝对路径的引用。

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

多谢你们

于 2013-04-02T10:40:59.077 回答
1

在 ViewModel 中引用会话

您可能没有使用 ASP.net MVC,但如果有人正在寻找答案,这将很有用。

我的情况完全相同,只是每次都会收到空异常,而我的同事根本没有,即使我们运行的是完全相同的代码。

我们的错误是从 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;
    }
于 2014-10-03T13:56:37.283 回答