2017-02-15 1 views
0

Ich habe dieses ziemlich direkte Stück Code unten.Asp.Net Server-seitiger Ausgabe-Cache wird jede Anfrage (HttpHandler)

Es gibt einige Dinge, die ich versucht habe und ich kann nicht verstehen, warum der serverseitige Ausgabecache bei http://localhost nicht funktioniert. Unten ist der letzte Versuch von "Cache-Einstellungen", um nicht ein HIT auf der Debug-Ausgabe zu sehen.

Es macht mich verrückt! Wie verhindere ich den HIT ...?! Wenn ich die Developer-Tools öffne und "Cache deaktivieren" wähle, erwarte ich eine zwischengespeicherte serverseitige Kopie und sehe kein HIT im Debug-Ausgabefenster.

Ich bin auf Windows 8, aber selbst in einer anderen Windows-Version (/ IIS-Version) kann ich mir nicht vorstellen, dass der Code anders wäre.

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; } 
     } 
    } 
} 

Antwort

0

Es stellt sich heraus, dass ApplicationInstance.CompleteRequest() den Schmerz in meiner Situation verursacht. Nach MSDN es:

ASP.NET bewirkt, dass alle Ereignisse und Filterung in der HTTP-Pipeline Kette der Ausführung umgehen und das Endrequest Ereignis direkt ausführen.

Dies ist der Asp.Net pipeline flow

Asp.Net pipeline flow

Der Handler irgendwo in der Mitte ausgeführt wird, wie Sie und nach dem Aufruf von ApplicationInstance.CompleteRequest() es alles sehen kann, überspringt und geht direkt Anfrage zu senden (oder CompleteRequest() intern) .

Wenn dies passiert, überspringt es auch die "Cache aktualisieren" -Ereignisse. Hier wird der Request Cache aktualisiert. wo die serverseitigen Ausgabe-Cache-Elemente hinzugefügt werden ...

Also, achten Sie darauf, was ApplicationInstance.CompleteRequest() tut, wenn Sie denken, dass Sie in Ihrem HttpHandler fertig sind!

Eine weitere interessante Lektüre: https://weblog.west-wind.com/posts/2009/May/21/Dont-use-ResponseEnd-with-OutputCache

Happy Caching!

Verwandte Themen