gpt4 book ai didi

.net - 404 关于外部组件中的 Controller

转载 作者:行者123 更新时间:2023-12-02 17:40:06 25 4
gpt4 key购买 nike

我在我的 Asp.Net MVC 4 项目中无法解决 404 响应。它内置于针对 4.5 的 VS2012 中。

我已将预编译的 View 和 Controller 内置到独立的 DLL 中。我能够动态加载 DLL 并从我的核心项目中检查它们,甚至调用它们的方法;但是,似乎 MVC 框架不知道 Controller 。我在这里很近,但缺少一些东西。

Controller 和 View 的背景

Controller 构建在独立的 MVC 项目中,并从 Controller 继承。那里没有什么太有趣的事情发生。 View 使用 RazorGenerator 并成为项目中的类。

项目的输出是一个正确包含 Controller 和 View 的 DLL。

DLL 实现了一个特定的接口(interface),我们称之为 IPlugin ,在库中的一个单独的类(不是 Controller 的一部分)中。

加载 DLL

在 Visual Studio 中以管理员身份运行,我编译了托管在 IIS 下的应用程序。构建项目后,我将插件 DLL 放入我的“插件”目录。没有调试(这在以后变得很重要),我打开 IE 并导航到该站点。请注意,此时应用程序已构建,但从未运行,因此将触发启动事件。如果我回收应用程序池,这里的一切仍然是一致的。

我有一个 Startup 类,它有两个方法,PreStartPostStart,并分别使用 WebActivator.PreApplicationStartMethodWebActivator.PostApplicationStartMethod 调用这些方法。
PreStart 是我执行以下操作的地方:

  • 获取我的“插件”目录中所有插件 DLL 的列表
  • 将所有插件复制到 AppDomain.CurrentDomain.DynamicDirectory
  • 加载类型...如果它包含一个 IPlugin 我然后
  • 将程序集添加到 BuildManager
  • 调用实现IPlugin的类上的一些方法

  • 在“PostStart”中,我执行了这段代码(基于来自 RazorGenerator.Mvc 的代码):
    foreach (var assembly in Modules.Select(m=>m.Value))
    {
    var engine = new PrecompiledMvcEngine(assembly)
    {
    UsePhysicalViewsIfNewer = HttpContext.Current.Request.IsLocal
    };

    ViewEngines.Engines.Insert(0, engine);
    VirtualPathFactoryManager.RegisterVirtualPathFactory(engine);
    }
    Modules 在此上下文中是一个键/值对,其中的值是加载的程序集。这段代码的目的是通过为每个知道如何解析 View 的程序集添加一个 View 引擎来确保 MVC 知道 View (这是 RazorGenerator 的一部分)。

    我怎么知道我很接近(但显然缺少雪茄)
    IPlugin 定义了一个名为 RegisterRoutes 的方法,您猜对了,为实现该接口(interface)的人注册路由。我在 PreStart 中调用此方法并添加路由 - 我已验证这些存在于我的路由表中。例如,在我的插件中定义的路由上,通过在 PreStart 期间动态调用该方法创建,在检查我的路由时,我看到类似这样的数据 token :
    Namespaces = Plugin.Name.Controllers

    因此,路由已注册,程序集已加载,我已验证 DLL 已正确复制到 AppDomain 的 DynamicDirectory。我能够调用在运行时动态加载的类的成员。但是,当我导航到与路由 匹配的 URL 时,我得到一个 404 。这不是“找不到 View ”的 YSOD,它更像是根本找不到 Controller 。

    这是让我感到困惑的部分 :如果此时不做任何事情,我返回 Visual Studio 并按 F5 ...一切正常。

    就像 Visual Studio 正在以某种我无法识别的方式意识到 Controller ,而 MVC 框架正在接受它。

    最后,一个问题

    我错过了什么,如何让 MVC 框架了解我的 Controller ?

    嘿,在这一点上,如果你还在读这个,谢谢。 :)

    最佳答案

    原来这是 Asp.Net 本身的一个错误。

    在与 Asp.Net 团队的 Eilon Lipton 讨论了这个问题后,认为这是 MVC 框架中的一些问题,Eilon 和几个团队成员深入研究了这些问题,发现在这次对话中错误处于较低级别:http://aspnetwebstack.codeplex.com/discussions/403529

    他们还提出了一种解决方法,其中包括在调用 BuildManager 之后对 AddReferencedAssembly 的另一个调用,我通过以下代码实现了该调用:

        // Add the plugin as a reference to the application
    BuildManager.AddReferencedAssembly(assembly);
    BuildManager.AddCompilationDependency(assembly.FullName);

    这允许您在预应用程序初始化阶段的启动时添加额外的 Controller /编译 View 。我现在正在做的是遍历我的插件目录中的 DLL 列表并将它们推送到 BuildManager 如上所述。

    这里唯一的限制是您不能动态删除程序集或清除缓存。我发现这样做的唯一方法是将以前未知的程序集添加到引用的程序集和编译依赖项中。我正在尝试在预应用程序初始化期间动态发出一个新程序集,这样我就可以始终有效地清除缓存并通过伪造一个新程序集来删除以前包含的插件。

    希望这对其他人有帮助。

    干杯。

    关于.net - 404 关于外部组件中的 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14901920/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com