Разрешить MVC обрабатывать ответ действия контроллера как статическое содержимое - PullRequest
2 голосов
/ 14 марта 2012

У меня есть одностраничное приложение 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 с Cache-Control:public,max-age=31536000, так же, как если бы на файлы CSS / JS ссылались напрямую, а не через действие контроллера.

Есть ли способ заставить MVC обрабатывать ответ на действие контроллера как staticContent: я действительно не хочу вручную устанавливать заголовок Cache-Control в моем контроллере, поскольку это будет означать, что и этот параметр, и этот в Web.config может выйти из синхронизации.

1 Ответ

2 голосов
/ 14 марта 2012

Вы ищете OutputCacheAttribute ?

При этом вы можете иметь кеш результатов на сервере и клиенте, используя свойства Duration и Location.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...