问题是我经常在生产站点(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()
方法的地方:
以前可能有人遇到过同样的问题。如果是这样,请分享您的解决方案。
提前致谢。
答案 0 :(得分:2)
这不会直接回答你的问题,但可能会帮助你调试问题的路径,因为它只在生产中发生,而不是在dev / debug中发生。
考虑更换你的行:
@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的来源并坚持一些日志更容易!如果它发生在调试中,你就不需要尝试这个。此外,它只是一个视图更改,因此不需要重新编译。