Asp.net mvc 请求.html文件时调用ASP.NET MVC控制器

Asp.net mvc 请求.html文件时调用ASP.NET MVC控制器,asp.net-mvc,asp.net-routing,Asp.net Mvc,Asp.net Routing,我需要为遗留应用程序添加一些新生命:) 我希望在请求“静态”HTML页面时调用MVC控制器,以便在将页面返回到客户端之前向页面添加一些标记 我试图遵循这条线索中的方法: …但即使我定义了这条路线: routes.MapRoute( name: "Topic", url: "html/{fileName}.html", defaults: new { controller = "Topic", action = "Index" }); 未调用控制器。我的web.con

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

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

我试图遵循这条线索中的方法:

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

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之外的其他东西,或者问题完全不同


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

我设置了与您相同的情况,它对我来说运行良好,因此您已经准备好了关键组件。测试和故障排除时需要记住的一些事项:

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

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

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

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

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

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

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

如果您执行此操作:

routes.RouteExistingFiles = true;
您应该会发现,即使没有添加处理程序,这种方法也可以工作。在控制器中,您可以使用
HostingEnvironment.VirtualPathProvider
GetFile
方法直接加载HTML,并对其进行处理—或者更好的方法是使用普通的MVC视图,只需添加内容,即可呈现与静态文件相同的内容


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

您是否在IIS7+集成管道模式下运行?如果您希望请求命中MVC控制器,我认为这没有帮助-页面不会直接执行,正如使用PageBuildProvider时预期的那样,但是,请求将被传递到MVC控制器,然后MVC控制器将以
.html
的形式代表URL呈现一个视图(可以是ASPX,也可以是Razor或其他任何东西)extension@Andras佐尔坦,你说得对,考虑到现有文件,您需要从您的答案中添加routes.routeeExistingFiles=true。如上所述,我的有效解决方案是整合Scott和Andras的响应。我必须选择一个,所以我标记了安德拉斯的答案,因为他添加了指向路线配置的指针,这在本问题或我最初链接的路线配置中没有涉及。我在这里+1d反映您的评论@CraigshoeMakerth问题的真正答案是按照安德拉斯和斯科特的建议去做。我测试了有无路由更新(per Andras)和有无web.config设置(per Scott),它们都是我要做的工作所必需的。谢谢,伙计们!我添加了一些IgnoreRoutes规则,以将应用程序向不需要服务器处理的其他静态内容开放。