10

我仍在尝试使用 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

4 回答 4

8

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

就我而言,这导致了控制器工厂中空控制器类型的问题。

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

这是关于此的 Gunnar Peipman 帖子的链接

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

于 2009-10-29T19:17:32.353 回答
5

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

当 MVC 无法解析路由表中的路由或路由指定不存在的控制器时,似乎 MVC 会将控制器类型传递给 null。我做了两件事来解决这个问题。您可能想要检查您的路由表并添加一个显示 404 错误页面的包罗万象的路由,如此处所述.Net MVC Routing Catchall not working

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

于 2009-06-20T13:10:33.887 回答
1

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

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

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

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

希望这可以帮助!

于 2009-07-17T17:07:33.147 回答
0

我认为您需要做的事情与默认 MVC 控制器工厂对 GetControllerInstance 方法所做的事情完全相同。如果您查看位于http://aspnetwebstack.codeplex.com/的 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 错误处理。

于 2012-10-24T12:56:49.323 回答