ASP.NET MVC: проблема с выходным кэшем - PullRequest
16 голосов
/ 18 ноября 2009

для моего текущего проекта необходимо сгенерировать динамический 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" здесь ... есть ли способ обойти это?

Спасибо

Ответы [ 3 ]

20 голосов
/ 18 ноября 2009

Вы можете перезаписать 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");
}
12 голосов
/ 18 ноября 2009

Это может быть ошибка в 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;
   }
}
0 голосов
/ 18 ноября 2009

Попробуйте установить VaryByContentEncoding, а также VaryByParam.

...