c# 設定 - 応答オブジェクトで構成されているにもかかわらず、応答として送信されなかったCache-Controlヘッダー




ブラウザ キャッシュ (4)

ASP.NET MVC Web APIでキャッシュヘッダーを設定しようとしていますが、IISからの応答では、CacheControl値の設定が無視されていることが示唆されています。

私の元々の想定は、このユースケースでは必要なSystem.Web.Http.CorsでEnableCorsAttributeを使用していたということでした。 しかし、その属性がなくても、レスポンスのCache-Controlヘッダーはまだ「プライベート」です。

私がここで間違っていることはありますか?

    // GET api/<version>/content
    // [EnableCors(origins: "*", headers: "*", methods: "*")]
    public HttpResponseMessage Get(HttpRequestMessage request)
    {
        int cacheMaxAgeSeconds;

        string cacheMaxAgeString = request.GetQueryString("cache-max-age") ?? request.GetQueryString("cache-max-age-seconds");

        string rawUri = request.RequestUri.ToString();

        try
        {
            cacheMaxAgeSeconds = cacheMaxAgeString == null ? Config.ApiCacheControlMaxSeconds : int.Parse(cacheMaxAgeString);
        }
        catch (Exception ex)
        {
            cacheMaxAgeSeconds = Config.ApiCacheControlMaxSeconds;

            //... 
        }

        try
        {
            //...

            var response = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new StringContent("...", Encoding.UTF8, "application/json")
            };

            response.Headers.CacheControl = new CacheControlHeaderValue
            {
                Public = true,
                MaxAge = TimeSpan.FromSeconds(cacheMaxAgeSeconds)
            };

            return response;
        }
        catch (Exception apiEx)
        {
            //...
        }
    }

応答

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: application/json; charset=utf-8
Date: Thu, 23 Jul 2015 10:53:17 GMT
Server: Microsoft-IIS/7.5
Set-Cookie: ASP.NET_SessionId=knjh4pncbrhad30kjykvwxyz; path=/; HttpOnly
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Content-Length: 2367
Connection: keep-alive

Answers

以下のコードは、バニラWebApiアプリケーション(System.Web.Http 4.0.0.0)で "cache-control:public、max-age = 15"を正しく設定しています。 だから、おそらく問題を引き起こすWebApi自体ではないでしょう。

キャッシュ設定を変更するいくつかの魔法があなたのプロジェクトにあるかもしれません(グローバルアクションフィルターや類似のものを考えてください)。 あるいは、HTTPヘッダーを書き換えるプロキシを経由しているかもしれません。

    public HttpResponseMessage Get()
    {
        var content = new JavaScriptSerializer().Serialize(new { foo = "bar" });

        var response = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StringContent(content, Encoding.UTF8, "application/json")
        };

        response.Headers.CacheControl = new CacheControlHeaderValue
        {
            Public = true,
            MaxAge = TimeSpan.FromSeconds(15)
        };

        return response;
    }

// returns in the response: "Cache-Control: public, max-age=15"

答えは、数週間後にこれを選んだ。

キャッシュコントロールヘッダーは、 デバッグビルドを実行しているときに「プライベート」に設定されているようです。 私がリリースビルドを実行すると、問題はなくなります。


これを引き起こす別のものを追加するには:

あなたはOwinパイプラインを通過します。

その場合は、次のように定義されたOwinミドルウェアでヘッダーを設定する必要があります。

class MiddleWare : OwinMiddleware
{
    public MiddleWare(OwinMiddleware next)
    : base(next)
    {
    }
    public override async Task Invoke(IOwinContext context)
    {
        context.Response.Headers["Cache-Control"] = "no-cache, no-store, must-revalidate";
        context.Response.Headers["Pragma"] = "no-cache";
        context.Response.Headers["Expires"] = "0";
        await Next.Invoke(context);
    }
}

catch (DbEntityValidationException ex)
{
    foreach (var item in ex.EntityValidationErrors)
    {
        //... inspect here 
    }
}

foreachループ内で必要な情報を見つけることができます。

希望が役立ちます。





c# asp.net-web-api http-caching