asp.net MVC 2自定义控制器工厂被调用两次,第二次controllerType为null

本文关键字:两次 第二次 null controllerType MVC net 自定义 控制器 调用 工厂 asp | 更新日期: 2023-09-27 18:14:02

我创建了一个自定义控制器工厂,以便能够使用StructureMap向我的控制器注入服务实例。

一切都工作得很好,除了每个请求控制器工厂第一次被调用时,它正确地解析了控制器,第二次被调用时,controllerType参数为空,所以StructureMap的GetInstance方法抛出一个ArgumentNullException: Value不能为空。参数名称:key

应用程序实际上不会崩溃,但如果我正在调试,它总是停在那里,我必须手动继续执行,以便显示视图。

谁能解释一下为什么会发生这种情况,我该如何解决?

下面是我的Global。Asax和控制器工厂:

控制器工厂:

public class IocControllerFactory : DefaultControllerFactory
{
    private readonly IContainer container;
    public IocControllerFactory(IContainer container)
    {
        if(container == null) throw new ArgumentNullException("container");
        this.container = container;
    }
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        return this.container.GetInstance(controllerType) as IController;
    }
}

Global.asax

private void RegisterControllerFactory()
{
    var ioc = new Container();
    var controllerFactory = new IocControllerFactory(ioc);
    ControllerBuilder.Current.SetControllerFactory(controllerFactory);
    ioc.Configure(r => 
        r.Scan(x =>
        {
            x.AssemblyContainingType<UserAccountController>();
            x.AddAllTypesOf<IController>();
            x.Include(t => typeof(IController).IsAssignableFrom(t));
        }
    ));
    ioc.Configure(r => r
        .For<IUserAccountService>()
        .Use<UserAccountService>());
}

非常感谢您的帮助

asp.net MVC 2自定义控制器工厂被调用两次,第二次controllerType为null

. NET MVC用默认配置将每个没有映射到控制器工厂文件的请求都打了出来。大多数浏览器默认会请求一个favicon.ico文件。所以,发生的事情是你的图标被调用,但没有映射到一个类型,所以StructureMap得到一个空类型和错误。

最简单的修复方法是添加一个favicon.ico文件或为路由添加一个忽略。