5

我需要为遗留应用程序添加一些新的生命:)

我想在请求“静态” HTML 页面时调用 MVC 控制器,以便在将页面返回给客户端之前向页面添加一些标记。

我尝试遵循此线程中找到的方法:如何在 .html 页面中读取 web.config 设置?

...但即使我定义了这条路线:

routes.MapRoute(
    name: "Topic", 
    url: "html/{fileName}.html", 
    defaults: new { controller = "Topic", action = "Index" });

控制器没有被调用。我的 web.config 定义为:

<remove name="WebServiceHandlerFactory-Integrated" />
<add name="HTML" path="*.html" verb="*" 
    type="System.Web.UI.PageHandlerFactory" 
    resourceType="File" preCondition="integratedMode" />

我怀疑我需要调用除 PageHandlerFactory 之外的其他东西,或者问题可能完全不同。

更新:我的开发环境正在使用集成管道模式,但我需要检查我的生产环境是否支持它。

4

2 回答 2

6

如果你这样做:

routes.RouteExistingFiles = true;

您应该会发现这是可行的——即使没有添加处理程序。在控制器中,您可以使用HostingEnvironment.VirtualPathProvider'GetFile方法直接加载 HTML 并对其执行某些操作 - 或者最好还是使用普通的 MVC 视图来呈现与静态文件相同的内容,只需添加您的内容即可。

尽管请注意,这意味着任何可能被任何路由捕获的文件都将被推送到 MVC 管道中。但是,如果使用适当的路由和物理路径分离,这通常不是问题。

于 2012-07-03T22:10:43.157 回答
3

我设置了与您相同的情况,并且对我来说效果很好,因此您已准备好关键组件。测试和故障排除时要记住的一些事项:

您的 web.config 确实需要 html 扩展的构建提供程序:

<system.web>
    <compilation>
      <buildProviders>
        <add extension=".html"
             type="System.Web.Compilation.PageBuildProvider" />
      </buildProviders>
    </compilation>
</system.web>

你的处理程序的复制和粘贴对我有用,所以看起来不错。

尽管我在一个干净的项目中使用了默认的 Home 控制器,但您的 MapRoute 的复制和粘贴也对我有用。因此,作为双重检查,只需确认您有一个名为 Topic 的控制器和一个名为 Index() 的 ActionResult 方法。

并确保您的 url 是 localhost.com:{port}/html/test.html 并且 /html/ 在路径中,因为您的规则要求这样做。

另一个很好的测试是将您的 MapRoute 更改为使用 aspx 并测试一个 aspx 页面,看看它是否有效。这将确认它是 IIS 映射还是 MVC 规则。如果它与 aspx 一起工作,那么问题与处理程序有关,但如果它也与 aspx 一起失败,那么它与 MVC 有关。

还要确认您使用的是 IIS Express 而不是 Cassini。Cassini 无法正确处理该问题,但 IIS Express 会。您可以通过右键单击您的项目进行确认,您应该会看到一个名为“使用 Visual Studio Development Studio...”的菜单选项。仅当您当前使用 IIS Express 时才会存在。

于 2012-07-03T22:10:14.523 回答