ASP.NET MVC: проблема с OutputCache
для моего текущего проекта необходимо создать динамический CSS...
Итак, у меня есть частичный вид, который служит в качестве поставщика CSS... Код контроллера выглядит следующим образом:
[OutputCache(CacheProfile = "DetailsCSS")]
public ActionResult DetailsCSS(string version, string id)
{
// Do something with the version and id here.... bla bla
Response.ContentType = "text/css";
return PartialView("_css");
}
Выходной профиль кэша выглядит следующим образом:
<add name="DetailsCSS" duration="360" varyByParam="*" location="Server" varyByContentEncoding="none" varyByHeader="none" />
Проблема заключается в следующем: когда я использую строку OutputCache ([OutputCache (CacheProfile = "DetailsCSS" )]), ответ имеет тип содержимого "text/html" вместо "text/css"... когда я удалите его, он работает как ожидалось...
Итак, для меня кажется, что OutputCache не сохраняет настройки "ContentType" здесь... существует ли какой-либо способ этого?
Спасибо
Ответы
Ответ 1
Вы можете перезаписать ContentType своим собственным ActionFilter, который выполняется после того, как произошел кеш.
public class CustomContentTypeAttribute : ActionFilterAttribute
{
public string ContentType { get; set; }
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.ContentType = ContentType;
}
}
И затем вызывается этот атрибут после OutputCache.
[CustomContentType(ContentType = "text/css", Order = 2)]
[OutputCache(CacheProfile = "DetailsCSS")]
public ActionResult DetailsCSS(string version, string id)
{
// Do something with the version and id here.... bla bla
return PartialView("_css");
}
Или (и я не пробовал это), но переопределить класс OutputCacheAttribute с реализацией CSS. Что-то вроде этого...
public class CSSOutputCache : OutputCacheAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
base.OnResultExecuting(filterContext);
filterContext.HttpContext.Response.ContentType = "text/css";
}
}
и это...
[CSSOutputCache(CacheProfile = "DetailsCSS")]
public ActionResult DetailsCSS(string version, string id)
{
// Do something with the version and id here.... bla bla
return PartialView("_css");
}
Ответ 2
Это может быть ошибка в ASP.NET MVC.
Внутри они имеют тип под названием OutputCachedPage
, который происходит от Page
. Когда OnResultExecuting
вызывается на OutputCacheAttribute
, он создает экземпляр этого типа и вызывает ProcessRequest(HttpContext.Current)
, который в итоге вызывает SetIntrinsics(HttpContext context, bool allowAsync)
, который устанавливает ContentType следующим образом:
HttpCapabilitiesBase browser = this._request.Browser;
this._response.ContentType = browser.PreferredRenderingMime;
Здесь исправление:
public sealed class CacheAttribute : OutputCacheAttribute {
public override void OnResultExecuting(ResultExecutingContext filterContext) {
string contentType = null;
bool notChildAction = !filterContext.IsChildAction;
if (notChildAction)
contentType = filterContext.HttpContext.Response.ContentType;
base.OnResultExecuting(filterContext);
if (notChildAction)
filterContext.HttpContext.Response.ContentType = contentType;
}
}
Ответ 3
Попробуйте установить VaryByContentEncoding, а также VaryByParam.