允许MVC将Controller Action响应视为静态内容

时间:2012-03-14 10:28:34

标签: javascript css asp.net-mvc asp.net-mvc-3

我有一个单页JavaScript应用程序,在ASP.NET MVC 3网站中保存。

为了缓存应用程序使用的JS / CSS文件,无需在每次更改时手动重命名文件,我都有以下路由&用于提供静态文件的相应控制器动作

的Global.asax.cs

routes.MapRoute(
    "AppCssFile",
    "style.{version}.min.css",
    new { controller = "StaticFile", action = "CssFile" }
);

routes.MapRoute(
    "AppJsFile",
    "app.{version}.min.js",
    new { controller = "StaticFile", action = "JsFile" }
);

StaticFileController

//NB: m_JsAppFolder references below just point to the root folder for static files

[HttpGet]
public FileResult CssFile()
{
    var sourceFile = HttpContext.Server.MapPath(Path.Combine(m_JsAppFolder, "assets", "style", "release.css"));
    return new FilePathResult(sourceFile, "text/css");
}

[HttpGet]
public FileResult JsFile()
{
    var sourceFile = HttpContext.Server.MapPath(Path.Combine(m_JsAppFolder, "release.js"));
    return new FilePathResult(sourceFile, "text/javascript");
}

这很有效,但问题我的Cache-Control标题没有返回我期望的值...

我在Web.config中有以下内容:

...
<urlCompression doStaticCompression="true" />
<staticContent>
    <!-- Set expire headers to 1 year for static content-->
<clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />
<!-- use utf-8 encoding for anything served text/plain or text/html -->
<remove fileExtension=".css" />
<mimeMap fileExtension=".css" mimeType="text/css" />
<remove fileExtension=".js" />
<mimeMap fileExtension=".js" mimeType="text/javascript" />
</staticContent>
...

我希望看到Cache-Control:public,max-age=31536000的Cache-Control标头,就像直接引用CSS / JS文件一样,而不是通过Controller Action。

无论如何让MVC将控制器操作响应视为staticContent:我真的不想在我的控制器中手动设置Cache-Control标头,因为这意味着这两个设置并且Web.config中的内容可能会不同步。

1 个答案:

答案 0 :(得分:2)

您在寻找OutputCacheAttribute吗?

使用此功能,您可以使用属性Duration和Location。

在服务器和客户端中使用结果缓存