我在下面提供了这段相当简单的代码。
我尝试了几件事,我无法理解为什么服务器端输出缓存无法在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; }
}
}
}
答案 0 :(得分:0)
事实证明ApplicationInstance.CompleteRequest()
导致了我的情况。根据{{3}}它:
使ASP.NET绕过所有事件并在HTTP管道执行链中进行过滤,并直接执行EndRequest事件。
这是MSDN
正如您所见,处理程序正在中间某处执行,在调用ApplicationInstance.CompleteRequest()
后,它会跳过所有内容并直接转到发送请求(或内部CompleteRequest()
)。
发生这种情况时,它也会跳过“更新缓存”事件。这是请求缓存更新的地方;将添加服务器端输出缓存项...
因此,当您认为ApplicationInstance.CompleteRequest()
已完成时,请注意HttpHandler
的作用!
快乐缓存!