我認爲最好的方法是使用過濾器,然後我會使用一個正則表達式來檢查,如果結果有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的代碼,你可能有不同的代碼。
希望這可以幫助你。