16

私の現在のプロジェクトでは、動的 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/css」ではなく「text/html」になります。削除すると、それは期待どおりに動作します...

だから、私にとっては、OutputCache が私の「ContentType」設定をここに保存していないようです...これを回避する方法はありますか?

ありがとう

4

3 に答える 3

20

キャッシュが発生した後に実行される独自の ActionFilter で ContentType を上書きできます。

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");
}
于 2009-11-18T20:28:09.970 に答える
12

これは、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;
   }
}
于 2009-11-18T19:07:44.033 に答える
-1

VaryByContentEncoding と VaryByParam を設定してみてください。

于 2009-11-18T12:49:15.883 に答える