2012-07-03 50 views
5

我需要一些新的生活增添到遗留应用程序:)调用ASP.NET MVC控制器当请求.html文件

我想打电话的MVC控制器时,在请求一个“静态”的HTML页面为了在将页面返回给客户端之前添加一些标记。

我试图按照此线索找到了方法:How to read web.config settings in .html page?

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

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或者可能的问题是完全不同的东西别的东西。

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

+3

你在IIS7 +集成管道模式下运行吗? –

回答

6

如果你这样做:

routes.RouteExistingFiles = true; 

你应该找到这个工作 - 即使没有处理程序的补充。在控制器中,您可以直接使用HostingEnvironment.VirtualPathProviderGetFile方法加载HTML,然后对其进行操作 - 或者更好的方法是使用正常的MVC视图,将静态文件显示为相同的内容,只需添加即可。

虽然请注意,这意味着任何可能被任何路由捕获的文件都将被压入MVC管道。然而,如果使用合理的路线和物理路径分离,这通常不是一个问题。

+0

这个问题的真正答案是做安德拉斯和斯科特建议的。我测试了无论是否有路由更新(每个Andras)以及有没有web.config设置(每个Scott),都需要它们使它适用于我正在尝试执行的操作。多谢你们! –

+0

我添加了一些IgnoreRoutes规则来打开应用程序,直到其他静态内容不需要服务器处理。 –

+0

是的,这是一个好主意:) –

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方法即可。

并且确保您的网址是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时才存在。

+0

我不认为这有助于如果您希望请求击中MVC控制器 - 页面不会被直接执行,因为它是在使用PageBuildProvider时的意图,而是将请求传递给MVC控制器,然后最终以* .html'扩展名的URL代替一个视图(可以是ASPX,可以是Razor或其他) –

+0

@Andras Zoltan,你是对的,它解释了现有文件你需要从你的答案中添加routes.RouteExistingFiles = true。 –

+0

正如我上面提到的那样,我的工作解决方案是整合来自Scott和Andras的回复。我必须选择一个,所以我标记了Andras'作为答案,因为他添加了指向未在此问题或原始链接的路径配置中的指针。 –

相关问题