每个请求都会触发Asp.Net服务器端输出缓存(HttpHandler)

时间:2017-02-15 09:34:51

标签: c# asp.net caching server-side

我在下面提供了这段相当简单的代码。

我尝试了几件事,我无法理解为什么服务器端输出缓存无法在http://localhost运行。下面是“缓存设置”的最后一次尝试,以便在Debug输出窗格中看到HIT。

这让我疯了!我如何阻止HIT ......?!当我打开Developer工具并检查Disable cache时,我期待一个缓存的服务器端副本,而不是在Debug输出窗格中看到HIT。

我在Windows 8上,但即使在另一个Windows版本(/ IIS版本)上,我也无法想象最终的代码会有所不同。

using System;
using System.Diagnostics;
using System.Net.Http;
using System.Web;

namespace WebApplication1
{
    /// <summary>
    /// Summary description for MyHandler
    /// </summary>
    public class MyHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            Debug.WriteLine("HIT"+DateTime.Now.ToLongTimeString());

            context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(5));
            context.Response.Cache.SetCacheability(HttpCacheability.Server);
            context.Response.Cache.SetValidUntilExpires(true);
            context.Response.Cache.SetOmitVaryStar(true);
            context.Response.Cache.VaryByParams["none"] = true;
            context.Response.Cache.SetMaxAge(new TimeSpan(0, 5, 0));

            // Just here for testing purposes
            const string url = "http://otherserver/image.png";
            using (var client = new HttpClient())
            {
                var task = client.GetStreamAsync(url);
                task.Wait();
                task.Result.CopyTo(context.Response.OutputStream);
                context.ApplicationInstance.CompleteRequest();
            }
        }

        public bool IsReusable
        {
            get { return true; }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

事实证明ApplicationInstance.CompleteRequest()导致了我的情况。根据{{​​3}}它:

  

使ASP.NET绕过所有事件并在HTTP管道执行链中进行过滤,并直接执行EndRequest事件。

这是MSDN

Asp.Net pipeline flow

正如您所见,处理程序正在中间某处执行,在调用ApplicationInstance.CompleteRequest()后,它会跳过所有内容并直接转到发送请求(或内部CompleteRequest())。

发生这种情况时,它也会跳过“更新缓存”事件。这是请求缓存更新的地方;将添加服务器端输出缓存项...

因此,当您认为ApplicationInstance.CompleteRequest()已完成时,请注意HttpHandler的作用!

另一个有趣的读物:Asp.Net pipeline flow

快乐缓存!