2017-11-03 9 views
1

(200)、私は次の値を受け取りました:ベストプラクティス(400)

Cache-Control: private, max-age=1200 

予想どおりです。

APIに間違った場所を渡し、APIがBadRequest(400)を返すと、上記と同じCache-Control値も返されます。

私の質問は、これがベストプラクティスですか?それとも、400の代わりにno-cache, no-storeを返すべきですか?それが必要な場合は、private, max-age=1200が200の場合はどのように返信し、.NETコアでno-cache, no-storeを返しますか?

答えて

0

私は、以下の条件を満足する必要があるため:レスポンスコードが200

  • ない場合

    1. は応答キャッシュ・ヘッダーの値を返しません。応答コードが200の場合は、private, max-age=1200を返します。
    2. 解決策は、特定のコントローラーアクションにのみ適用する必要があります。

    代わりにIResultFilterを実装する属性クラスを作成することにしました。

    public sealed class PrivateCacheControlResultFilterAttribute : Attribute, IResultFilter 
    { 
        public void OnResultExecuted(ResultExecutedContext context) 
        { 
        } 
    
        public void OnResultExecuting(ResultExecutingContext context) 
        { 
         context.HttpContext.Response.OnStarting(state => 
         { 
          var httpContext = ((ResultExecutingContext)state).HttpContext; 
    
          if (httpContext.Response.StatusCode == 200) 
           httpContext.Response.GetTypedHeaders().CacheControl = new CacheControlHeaderValue 
           { 
            Private = true, 
            MaxAge = TimeSpan.FromSeconds(1200) 
           }; 
          return Task.CompletedTask; 
         }, context); 
        } 
    } 
    

    この新しい属性は、GetAllUniversitiesアクションで使用します。

    [PrivateCacheControlResultFilter] 
    [HttpGet("universities")] 
    public IActionResult GetAllUniversities(string location) 
    { 
        if (/*location not found*/) 
         return BadRequest(); 
    
        ... 
        return Ok(universities); 
    }