结构图控制器工厂和MVC中的空控制器实例

时间:2009-05-29 00:44:57

标签: model-view-controller null controller structuremap

我仍在尝试使用StructureMap来解决问题,而我遇到的一个问题是我的Controller Factory类在传递空控制器类型时会爆炸。这仅在应用程序第一次构建时发生,之后每个后续构建都可以正常工作。即使我关闭Visual Studio并重新打开项目(我没有在IIS中运行它)。这几乎就像有某种缓存一样。这就是控制器类的样子:

public class IocControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(Type controllerType)
    {
        try
        {
            return (Controller)ObjectFactory.GetInstance(controllerType);
        }
        catch (StructureMapException)
        {
            System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave());
            throw;
        }
    }
}

可能有什么不对?我是否需要注册每个控制器?谢谢。

4 个答案:

答案 0 :(得分:8)

当您加载网站时,大多数浏览器都在寻找favicon.ico,并且可能有一些缓存涉及此行为,这可能解释了您提到的奇怪的“仅在第一次构建时失败”。

在我的情况下,这导致控制器工厂中出现空控制器类型的问题。

在global.asax中添加routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });会使错误消失,请求应该落到文件系统中,而MVC不会在代码中查找favico.ico控制器。

以下是Gunnar Peipman post about this

的链接

我通过覆盖自定义控制器工厂类中的GetControllerType(字符串controllerName)并检查每个请求的controllerName值是什么来发现。

答案 1 :(得分:5)

我遇到了围绕ninject建立的控制器工厂的同样问题。

当无法解析路由表中的路由或路由指定无现有控制器时,MVC似乎会为controllertype传递null。我做了两件事来解决这个问题。您可能需要检查路线表并添加一条显示404错误页面的捕获路线,如此处所述.Net MVC Routing Catchall not working

您还可以检查路由调试器出了什么问题。 http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

答案 2 :(得分:1)

我遇到了类似的问题。我相信这是对不存在的图像,CSS文件等的HTTP请求。

我们知道MVC路由首先查看所请求的文件是否物理存在。如果没有,则根据配置的路由测试URL。我认为对物理上不存在的图像的请求被传递给路由引擎,并且没有匹配任何路由,所以使用了NULL。

因此,要修复此问题,请使用FireBug或其他内容来监视并修复损坏的HTTP请求。在开发过程中,我使用这样的路由来暂时绕过这些问题(我的所有资源文件夹都以_Images,_Styles等下划线开头):

routes.IgnoreRoute("_*");  // TODO: Remove before launch

希望这有帮助!

答案 3 :(得分:0)

我认为你需要做的是与默认MVC控制器工厂在GetControllerInstance方法上做的完全相同的事情。如果您在http://aspnetwebstack.codeplex.com/查看DefaultControllerFactory的Microsoft源代码,您会看到当ControllerType为null时,DefaultControllerFactory会抛出404 Exception。以下是我们根据这些信息进行操作的方法:

 public class StructureMapControllerFactory : DefaultControllerFactory
 {
      protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
      {
           if (controllerType == null)
                return base.GetControllerInstance(requestContext, controllerType);
           var controller = ObjectFactory.GetInstance(controllerType);
           return (IController)controller;
      }
 }

基本上这将确保当用户输入无效路由时,应用程序将其处理为404错误。