2017-02-15 4 views
0

У меня есть этот довольно прямой фрагмент кода ниже.Выходной кэш на стороне сервера Asp.Net получает каждый запрос (HttpHandler)

Есть несколько вещей, которые я пробовал, и я не понимаю, почему серверный кеш-сервер не работает на http://localhost. Ниже приведена последняя попытка «настроек кеша», чтобы не см. HIT на панели вывода Debug.

Это сводит меня с ума! Как предотвратить HIT ...?! Когда я открываю инструменты разработчика и проверяю Отключить кеш, я ожидаю кешированную копию на стороне сервера и не вижу HIT в области вывода Debug.

Я нахожусь в Windows 8, но даже в другой версии Windows (/ IIS Version) я не могу представить, что возможный код будет другим.

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

Оказывается, что ApplicationInstance.CompleteRequest() вызывает боль в моей ситуации. По MSDN его:

Причина ASP.NET обойти все события и фильтрацию в цепочке HTTP трубопровода исполнения и непосредственно выполнить EndRequest события.

Это Asp.Net pipeline flow

Asp.Net pipeline flow

Обработчик выполняется где-то в середине, как вы можете видеть, и после вызова ApplicationInstance.CompleteRequest() он пропускает все и идет непосредственно Отправить запрос (или CompleteRequest() внутри) ,

Когда это произойдет, он также пропускает события «Обновить кеш». Это - то, где Кэш Запроса обновляется; где будут добавлены элементы кэша вывода на стороне сервера ...

Так что имейте в виду, что ApplicationInstance.CompleteRequest() делает, когда вы думаете, что все готово в HttpHandler!

Еще интересно читать: https://weblog.west-wind.com/posts/2009/May/21/Dont-use-ResponseEnd-with-OutputCache

Днем кэширования!

Смежные вопросы