我仍在尝试使用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;
}
}
}
可能有什么不对?我是否需要注册每个控制器?谢谢。
答案 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错误。