I'm trying to set some caching HTTP headers for all requests that return an "HTML page".
我可以在某些全球范围内执行此操作,例如BeginRequest
或全局MVC过滤器(如该问题所示)。
为了实现这一点,我必须将HTML页面与其他应该缓存的请求区分开来(主要是我认为的资源,但我不确定)。
我不确定如何定义" HTML页面"以严格的方式,以便我可以把它放入算法。我怎么能检测到这样的请求?
我真的不想标记我单独编写的所有 MVC操作。那很乏味,我可以忘记一些事情。
答案 0 :(得分: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());
}
}
我不是正则表达式专家,我从this question获得了此正则表达式,但看起来我们需要通过检查是否至少有 HTML标记来改进这一点,否则如果结果是XML,它看起来正则表达式匹配(尽管你可能也想为XML设置不缓存,它取决于你)。
禁用缓存的代码in this answer,您可能有不同的代码。
希望这会对你有所帮助。