0

问题是我经常在生产站点(ASP.NET MVC 3)收到错误,但无法在本地重现此错误。异常的文本是:

ExceptionType: System.NullReferenceException
Message: Object reference not set to an instance of an object.
StackTrace:
   at System.Collections.Specialized.NameObjectCollectionBase.BaseGetAllKeys()
   at System.Collections.Specialized.NameValueCollection.get_AllKeys()
   at MvcSiteMapProvider.MvcSiteMapNode.get_MetaAttributes()
   at MvcSiteMapProvider.Web.Html.SiteMapNodeModelMapper.MapToSiteMapNodeModel(SiteMapNode node, MvcSiteMapNode mvcNode, IDictionary`2 sourceMetadata)
   at MvcSiteMapProvider.Web.Html.SiteMapPathHelper.BuildModel(MvcSiteMapHtmlHelper helper, SiteMapNode startingNode)
   at MvcSiteMapProvider.Web.Html.SiteMapPathHelper.SiteMapPath(MvcSiteMapHtmlHelper helper, String templateName)
   at ASP._Page_Views_Shared__LoggedInLayout_cshtml.Execute() in c:\Solution\Sites\Project2Site\Views\Shared\_LoggedInLayout.cshtml:line 86
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
   at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
   at System.Web.WebPages.WebPageBase.Write(HelperResult result)
   at System.Web.WebPages.WebPageBase.RenderSurrounding(String partialViewName, Action`1 body)
   at System.Web.WebPages.WebPageBase.PopContext()
   at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)

我在本地没有这样的错误。这是我调用MvcSiteMap().SiteMapPath()方法的地方:

在此处输入图像描述

可能有人以前遇到过同样的问题。如果是这样,请分享您的解决方案。

提前致谢。

4

1 回答 1

2

这不会直接回答您的问题,但可以帮助您调试问题,因为它只发生在生产中而不是在开发/调试中。

考虑更换您的线路:

@Html.MvcSiteMap().SiteMapPath()

有类似的东西:

@SafeBreadCrumb()

@helper SafeBreadCrumb() {
    MvcHtmlString output;
    try
    {
        output = Html.MvcSiteMap().SiteMapPath();
    }
    catch (Exception e)
    {
        output = new MvcHtmlString(e.Message);    
    }
    <text>@output</text>
}

感觉有点脏,但总比抓到 MvcSiteMapProvider 的源头,再贴一些日志要容易!如果它发生在调试中,你不需要尝试这个。另外,这只是视图更改,因此不需要重新编译。

于 2012-09-24T13:35:27.330 回答