2013-04-09 65 views
2

我把一个子目录中所谓的“保护”和我放弃了在该目录中一个简单的test.html文件放在我的ASP MVC 4应用程序,但我不能为我的生活弄清楚如何当我在浏览器中查看test.html文件时,触发我的自定义全局AuthorizeAttribute类。ASP MVC 4不处理静态文件

我使用的是IIS Express在集成模式,所以我认为这是可行的。我甚至在集成模式下尝试过IIS 7,但它仍然不适用于我。

但是,也许我会的事情都错了。也许这是我的一些误解。

基本上,我需要以编程方式批准该文件夹内请求静态文件。还有另一种方法可以做到吗?

更新为2013年4月9日上午10时07分25秒的AD的:下面Zidad的回答得到的东西在正确的方向前进,但我遇到了麻烦,现在配置的路由。这是我得到的,但该文件仍然直接提供,而不是点击家庭/文件操作。

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

routes.MapRoute("NotFound", "protected/test.html", new { controller = "Home", action = "File" }); 

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 

更新为2013年4月9日上午十点二十分54秒由AD:Ohhhhhhhhhhhhhhhhhhh,现在我明白了!对我而言绝对是一个误解。猜猜我还有一些事情要学习。 :)

回答

3

首先确保添加到您的web.config文件,以确保提供静态文件时,IIS不绕过.NET:

<system.webServer> 
... 
    <modules runAllManagedModulesForAllRequests="true" /> 
... 
</system.webServer> 

,那么你应该能够添加一个web.config文件包含受保护的文件夹:

<authorization> 
    <deny users="?" /> 
</authorization> 

如果你想使用“AuthorizeAttribute”,你可以映射到一个控制器动作返回在受保护的文件夹中的文件路径,属性适用于方法,像这个:

Can an ASP.NET MVC controller return an Image?

UPDATE:保持URL对受保护的文件相同的,你可以配置这样的路线:

routes.MapRoute(
       name: "ProtectedFile", 
       url: "protected/{name}", 
       defaults: new { controller = "Home", action = "File", name = "index.html" }); 

然后写你的动作是这样的:

public ActionResult File(string name){ 
// return file 
} 

看哪:通过.NET提供所有静态文件会有性能损失,并且此操作不考虑IIS将执行automati的所有HTTP最佳实践凯莉为你服务时的静态文件,如静态内容压缩,返回“不修改(304)” HTTP状态,增加的ETag等

+0

更新,现在的问题反映的情况。 – 2013-04-09 14:05:59