2017-04-18 28 views
0

I'm trying to set some caching HTTP headers for all requests that return an "HTML page".檢測,在一個ASP.NET MVC的Web應用程序

返回一個HTML頁面請求我能做到這一點在一些全球地方,如BeginRequest或在全球MVC過濾器(在這個問題的建議)。

對於工作,我必須區分,都應該被緩存其他請求HTML頁面(我認爲主要是資源,但我不知道)。

我不確定如何在嚴格的方式定義「HTML網頁」,這樣我可以把它變成一個算法。我怎麼能發現這樣的要求?

我真的不想標記全部我單獨編寫的MVC操作。這很乏味,我可以忘記一些事情。

回答

0

我認爲最好的方法是使用過濾器,然後我會使用一個正則表達式來檢查,如果結果有HTML:

創建一個過濾器:

public class NoCacheForHTMLResult : IActionFilter 
{ 

    public void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     Regex tagRegex = new Regex(@"<[^>]+>"); 


     string response = filterContext.RequestContext.HttpContext.Response.Output.ToString(); 
     bool hasHtml = tagRegex.IsMatch(response); 

     if (hasHtml) 
     { 
      filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1)); 
      filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false); 
      filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
      filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
      filterContext.HttpContext.Response.Cache.SetNoStore(); 
     } 
    } 

    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

    } 

} 

...並添加在全局過濾器(您App_Start內):

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new NoCacheForHTMLResult()); 
    } 
} 

我不是一個正則表達式的專家,我這正則表達式FR OM this question,但看起來我們需要改善這一點,通過檢查,如果有至少一個HTML標籤,反之結果是XML,它看起來正則表達式將匹配(儘管你可能需要設置沒有緩存的XML作爲好吧,這取決於你)。

禁用緩存我in this answer的代碼,你可能有不同的代碼。

希望這可以幫助你。

相關問題