检测返回ASP.NET MVC Web应用程序中的HTML页面的请求

时间:2017-04-18 09:40:38

标签: asp.net .net asp.net-mvc

I'm trying to set some caching HTTP headers for all requests that return an "HTML page".

我可以在某些全球范围内执行此操作,例如BeginRequest或全局MVC过滤器(如该问题所示)。

为了实现这一点,我必须将HTML页面与其他应该缓存的请求区分开来(主要是我认为的资源,但我不确定)。

我不确定如何定义" HTML页面"以严格的方式,以便我可以把它放入算法。我怎么能检测到这样的请求?

我真的不想标记我单独编写的所有 MVC操作。那很乏味,我可以忘记一些事情。

1 个答案:

答案 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,您可能有不同的代码。

希望这会对你有所帮助。