ASP MVC.NET3本地IIS7对象引用错误

时间:2012-01-24 23:53:49

标签: asp.net-mvc iis-7

在开发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,Func 1 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));
}

3 个答案:

答案 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管道中进一步下降。

希望有所帮助。