删除Pragma:使用Asp.net MVC核心中的操作筛选器从标头中消除高速缓存

时间:2019-06-19 11:32:50

标签: c# iis asp.net-core http-headers arr

我正在尝试使用C#动作过滤器从标头中删除Pragma:no-cache,但是没有任何运气。

我已在网站上使用ARR进行磁盘缓存。但是我的网站有些页面不需要磁盘缓存。

为此,我需要从标题中删除Pragma或任何其他缓存控件。 这样就不会将页面包括在磁盘缓存中。

我尝试了以下代码

  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
        // here condition of my action method and controller name
       HttpContext.Response.Headers.Remove("Pragma", "no-cache");
                       //OR
       HttpContext.Request.Headers.Remove("Pragma", "no-cache");   

  } 

但是我的动作方法仍然包含语用

如果我更新到web.config文件中以删除/更新标头值,而不是将其从所有网站方法中删除。

因此,如果可能的话,删除该表单Action过滤器对我们不利。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以使用Middleware进行此操作-尽管我还没有尝试过,但是您应该也可以将下面的代码改编为某种Filter

基本上,正如@AliBahrami所说,一旦响应开始,您就无法更改标头-因此,您需要提供一个将由框架调用的func,它将为您完成此功能-在示例中为Response.OnStarting下方:

        public static IApplicationBuilder UseNoCachingPolicy( this IApplicationBuilder applicationBuilder )
        {
            return applicationBuilder.Use( async (context, next) => {
                    if(/*this request is one I don't want to cache*/)
                    {
                        context
                                .Response
                                .OnStarting( state => {
                                                var responseContext = (HttpContext)state;
                                                //remove the header you don't want in the `responseContext`
                                                return Task.CompletedTask;
                                     }, context );
                    }

                    await next();
            });
        }