在开发mvc Web应用程序期间,我正在鼓励运行该站点的本地实例的问题。当我尝试重新加载页面时,在第一次加载成功后,我看到了以下错误。如果我通过VS虚拟服务器运行该站点,则没有问题。我的应用程序池正在以集成模式运行,它正在运行.net 4.知道为什么会这样吗?这有足够的信息吗?
[NullReferenceException:对象引用未设置为对象的实例。] System.Web.HttpServerVarsCollection.Get(String name)+109 System.Web.Mvc.UrlRewriterHelper.WasThisRequestRewritten(HttpContextBase httpContext)+59 System.Web.Mvc.PathHelpers.GenerateClientUrlInternal(HttpContextBase httpContext,String contentPath)+213 System.Web.Mvc.PathHelpers.GenerateClientUrlInternal(HttpContextBase httpContext,String contentPath)+168 System.Web.Mvc.PathHelpers.GenerateClientUrl(HttpContextBase httpContext,String contentPath)+148 C:\ Development \ Hg \ LeadManager \ Web.UI \ Helpers \ MenuHelper.cs中的LeadManager.Web.UI.Helpers.MenuHelper.GenerateUrl(String url):1132 C:\ Development \ Hg \ LeadManager \ Web.UI \ Helpers \ MenuHelper.cs中的LeadManager.Web.UI.Helpers.MenuHelper.BuildLeadManagementMenu(菜单navMenu,代理程序代理):554 C:\ Development \ Hg \ LeadManager \ Web.UI \ Helpers \ MenuHelper.cs中的LeadManager.Web.UI.Helpers.MenuHelper.AddNavMenu(代理程序代理):530 c:\ Development \ Hg \ LeadManager \ Web \ Views \ Shared_Layout.cshtml中的ASP._Page_Views_Shared__Layout_cshtml.Execute():115 System.Web.WebPages.WebPageBase.ExecutePageHierarchy()+279 System.Web.Mvc.WebViewPage.ExecutePageHierarchy()+ 103 System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext,TextWriter writer,WebPageRenderingBase startPage)+172 System.Web.WebPages.WebPageBase.Write(HelperResult result)+88 System.Web.WebPages.WebPageBase.RenderSurrounding(String partialViewName,Action
1 body) +233 System.Web.WebPages.WebPageBase.PopContext() +233 System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +377 System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +32 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func
1 continuation)+748196 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter过滤器,ResultExecutingContext preContext,Func1 continuation) +748196 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList
1过滤器,ActionResult actionResult)+265 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,String actionName)+748160 System.Web.Mvc.Controller.ExecuteCore()+159 System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)+334 System.Web.Mvc。&lt;&gt; c_ DisplayClassb.b _5()+62 System.Web.Mvc.Async。&lt;&gt; c_ DisplayClass1.b _0()+15 System.Web.Mvc。&lt;&gt; c_ DisplayClasse.b _d()+52 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+ 437 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&amp; completedSynchronously)+354
MenuHelper用于构建导航菜单。失败的代码是if:
之外的return语句private static string GenerateUrl(string url)
{
if (instance == null)
{
// hack to enable using this on old web forms pages
return UrlHelper.GenerateContentUrl(url, new HttpContextWrapper(HttpContext.Current));
}
return (new UrlHelper(instance.htmlHelper.ViewContext.RequestContext)).Content(url);
}
private static string GenerateUrl(string actionName, string controllerName)
{
if (instance == null)
{
// hack to enable using this on old web forms pages
return GenerateUrl(String.Format("{0}/{1}", controllerName, actionName));
}
if (instance.htmlHelper == null)
throw new InvalidOperationException("htmlHelper has not been populated.");
if (instance.htmlHelper.ViewContext == null)
throw new InvalidOperationException("ViewContext has not been populated.");
if (instance.htmlHelper.ViewContext.RequestContext == null)
throw new InvalidOperationException("RequestContext has not been populated.");
UrlHelper urlHelper = new UrlHelper(instance.htmlHelper.ViewContext.RequestContext);
if (urlHelper == null)
throw new InvalidOperationException("UrlHelper has not been populated.");
if (String.IsNullOrEmpty(actionName))
throw new InvalidOperationException("actionName has not been populated.");
if (String.IsNullOrEmpty(controllerName))
throw new InvalidOperationException("controllerName has not been populated.");
return (urlHelper.Action(actionName, controllerName));
}
答案 0 :(得分:4)
我发现了这个问题,它是IIS7 URL重写模块。我不知道为什么或如何,但我通过卸载解决了这个问题。
答案 1 :(得分:1)
我也遇到了这个问题,确实卸载IIS7 URL重写模块有助于解决这个问题。问题是我们在所有服务器上都安装了Rewrite模块,这让我有点紧张。所以我仔细研究了一下,看看我改变了什么导致了这一点,结果发现是我。事实上,我之前已经做了几次,似乎没有学习,因为这是一件容易的事情。
我的类通过像
这样的构造函数将UrlHelper作为依赖项public class MyClass : IMyInterface
{
private readonly UrlHelper _url;
public MyClass(UrlHelper url)
{
_url = url;
}
public RedirectResult RedirectMeSomewhere()
{
return new RedirectResult(_url.Action("MyAction", "MyController"));
}
}
我的Ninject绑定看起来像这样
Bind<IMyInterface>()
.To<MyClass>()
.InSingletonScope();
它应该看起来像这样,因此它为请求提供了正确的UrlHelper,而不是在首次点击网站时作为单例创建的已经处理的UrlHelper。
Bind<IMyInterface>()
.To<MyClass>()
.InRepositoryScope();
注意这些事情需要一段时间,我需要进行一项测试,以确保UrlHelper不会以单身形式提供。
<强> TL:博士强>
我通过其构造函数将UrlHelper作为依赖项的类的Ninject绑定设置为SingletonScope()
而不是RequestScope()
,这显然是非常糟糕的原因。
无论如何,希望能帮助某人(或将来的我)。
答案 2 :(得分:-1)
所以这就是失败的路线:
return (new UrlHelper(instance.htmlHelper.ViewContext.RequestContext)).Content(url);
我们知道实例不是null,因为上面的行已经检查了null。空引用异常是最常见的未处理异常,也是最容易避免的异常。通常,您永远不应假设属于可空类型的属性或参数不为空。我的猜测是instance.htmlHelper是你的问题。我假设htmlHelper是System.Web.Mvc.HtmlHelper的一个实例。因此,如果这是由MVC创建的有效HtmlHelper,则ViewContext和RequestContext 应该不为空。
简单的解决方案是检查这样的空值:
if (instance.htmlHelper == null)
{
throw new InvalidOperationException("htmlHelper has not been populated.");
}
return (new UrlHelper(instance.htmlHelper.ViewContext.RequestContext)).Content(url);
显然你可以为ViewContext和RequestContext重复这一点,MVC应该填充它们。
现在假设htmlHelper为null(最可能的情况),这里有一个轻微的设计问题。你应该做的是扩展HtmlHelper类而不是使用静态方法。此外,您似乎正在使用某种静态实例,这可能在MVC中也无效。 MVC 通常为每个请求实例化控制器和视图。您仍然可以将静态方法用于Web表单实现,但对于MVC,您应该像这样扩展HtmlHelper:
public static MvcHtmlString GenerateUrl(this htmlHelper, string url)
{
return (new UrlHelper(htmlHelper.ViewContext.RequestContext)).Content(url);
}
确保您始终使用MVC中当前活动的HtmlHelper而不是某些静态实例。如果ViewContext或RequestContext在请求完成后可能为null,我不确定是否在我的头顶。在一次请求之后,我从未尝试过持久化HtmlHelper。即使它们不为空,否则它们可能无效并导致您的问题在MVC管道中进一步下降。
希望有所帮助。