Model view controller MVC中的StructureMap控制器工厂和空控制器实例

Model view controller MVC中的StructureMap控制器工厂和空控制器实例,model-view-controller,null,controller,structuremap,Model View Controller,Null,Controller,Structuremap,我仍在试图解决StructureMap的问题,我遇到的一个问题是,当向其传递null控制器类型时,我的控制器工厂类崩溃。只有当应用程序第一次构建时才会发生这种情况,之后每个后续构建都可以正常工作。即使我关闭了VisualStudio并重新打开了项目(我没有在IIS中运行它)。这几乎就像是在进行某种缓存。这就是控制器类的外观: public class IocControllerFactory : DefaultControllerFactory { protected override

我仍在试图解决StructureMap的问题,我遇到的一个问题是,当向其传递null控制器类型时,我的控制器工厂类崩溃。只有当应用程序第一次构建时才会发生这种情况,之后每个后续构建都可以正常工作。即使我关闭了VisualStudio并重新打开了项目(我没有在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;
        }
    }
}

有什么不对劲吗?我需要注册每个控制器吗?谢谢。

我在ninject附近建造的控制器工厂遇到了同样的问题

当MVC无法从路由表解析路由或当路由指定一个不存在的控制器时,它似乎会将controllertype的null传递给您。我做了两件事来解决这个问题。您可能希望检查路由表并添加一个catchall路由,该路由显示404错误页面,如下所述

您还可以使用路由调试器检查出了什么问题。
我也有类似的问题。我相信这是对不存在的图像、CSS文件等的HTTP请求

我们知道MVC路由首先查看请求的文件是否实际存在。如果没有,那么URL将根据配置的路由进行测试。我认为对物理上不存在的映像的请求被传递到路由引擎,并且与任何路由都不匹配,因此使用了NULL

因此,要修复它,请使用或其他东西来监视和修复损坏的HTTP请求。在开发过程中,我使用了这样的方法来暂时绕过这些问题(我所有的资源文件夹都以下划线开头,如_Images、_style等):


希望这有帮助

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

在我的例子中,这导致了控制器工厂中的空控制器类型问题

添加一个
routes.IgnoreRoute({*favicon}),新的{favicon=@”(.*/)?favicon.ico(/.*)”
在global.asax中,如果错误消失,则请求应通过文件系统,而无需MVC在代码中查找favico.ico控制器

这里有一个链接


我是通过在自定义控制器工厂类中重写GetControllerType(string controllerName)并检查每个请求的controllerName值来发现的。

我认为您需要做的事情与默认MVC控制器工厂在GetControllerInstance方法上做的事情完全相同。如果查看位于的DefaultControllerFactory的Microsoft源代码,您将看到当controllerType为null时DefaultControllerFactory抛出404异常。根据这些信息,我们是如何做到这一点的:

 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错误处理。

传递给它的空控制器是什么意思?我是指传递给GetControllerInstance()的控制器类型的空引用。我不明白的是空引用是从哪里来的。我猜MVC框架正在传递一个空的控制器实例?我最初认为它与StructureMap有关,但事实并非如此。我想我可以在方法中检查null,但我更想弄清楚它为什么这样做。最奇怪的是,它发生在我打开项目并在重新启动后第一次在VisualStudio中构建它之后。从那以后,它每次都能工作。我遇到了完全相同的问题。有人对此有解决方案吗?我还没有弄清楚最初的问题主要是什么,因为它很难调试。我必须重新启动机器并重新打开项目才能真正复制问题。我最后做的只是检查一个空的控制器实例。它似乎没有破坏任何东西,但了解问题发生的原因肯定会有所帮助。另一种解决方案是,在扩展现有控制器工厂时:检查controllerType是否为null,如果为null,则让现有工厂处理请求,而不是自己处理。请提供更多详细信息?我遇到了同样的问题,上面的解决方案对我不起作用(抛出了一个HttpException,我被返回到调试器)。您是否覆盖了控制器工厂中的任何其他方法?你们提供了施工人员吗?您是如何在Global.asax中注册的?即使我的自定义控制器工厂只调用基本实现,我仍然会得到错误。我找到了答案。我只是用
DebuggerNonUserCodeAttribute
装饰了
GetControllerInstance
,现在一切都正常了。
 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;
      }
 }