2015-01-19 2 views
0

Я пытаюсь разработать сложное кэширование для моего приложения ASP.net. Однако из-за отсутствия комплексной документации задача превратилась в более сложное назначение, чем предполагалось.Как организовать настраиваемое кэширование в модуле IIS?

Я создал модуль IIS, который подписывается на HttpApplication и предположим, что выполнить работу. Код ниже:

namespace Cache 
{ 
    using System; 
    using System.IO; 
    using System.Web; 

    public class Control : IHttpModule 
    { 
     #region Public Methods 

     public void Dispose() 
     { 
     } 

     public void Init(HttpApplication context) 
     { 
      context.ResolveRequestCache += onResolveRequestCache; 
      context.UpdateRequestCache+= onUpdateRequestCache; 
     } 

     #endregion Public Methods 

     #region Private Methods 

     private void onResolveRequestCache(object sender, EventArgs e) 
     { 
      var application = (HttpApplication)sender; 

      // Get cached response body and fire response    
     } 

     private void onUpdateRequestCache(object sender, EventArgs e) 
     { 
      var application = (HttpApplication)sender; 

      // Put response body to cache 
     } 

     #endregion Private Methods 
    } 
} 

Однако я столкнулся со следующими препятствиями: Не ясно, как сломать трубопровод выполнения, если объект был найден в кэше. Оба метода, которые я обнаружил: HttpApplication.Context.Response.End() и HttpApplication.Context.Response.Flush() имеют свои недостатки, такие как необходимость вручную устанавливать все заголовки или запускать все последующие события в конвейере выполнения, даже если они не нужны.

Есть ли рекомендации по заполнению HttpApplication.Context.Response тела с информацией, полученной от поставщика кеш-памяти, и как установить правильные заголовки (более или менее автоматически, возможно, кешировать их выборочно?) И как правильно пропустить шаги конвейера выполнения для достижения наилучшего применения представление.

+0

Его не очень понятно, что именно то, что вы хотите достичь путем обработки этих событий? Не могли бы вы рассказать подробнее? –

+0

@PankajKapare, я хочу сохранить свой ответ на кеш Redis и получить его потом. – shytikov

+0

Похоже, вы хотите подключить кэш-память пользовательского вывода. Если это случай, то вот ссылки, которые могут вам помочь. http://weblogs.asp.net/gunnarpeipman/asp-net-4-0-writing-custom-output-cache-providers и https://www.nuget.org/packages/AspNet.Caching.Output/ –

ответ

0

Весь подход, который я рассматривал, был неверен.

Задача пользовательского кэширования не должна решаться как модуль IIS, а как пользовательский поставщик кэшей.

Наиболее документированный пример, как создать такое решение, я нашел в следующей статье: http://msdn.microsoft.com/en-us/magazine/gg650661.aspx

Однако это не отвечает на вопрос, как контролировать поведение кэша, если вы работаете с скомпилированным приложением ASP.NET и не в состоянии ввести некоторый код в контроллеры.

И если необходимо выполнить сложное и агрессивное кэширование, в этом случае может быть ответом пользовательский модуль для IIS.

Например, я изменил onUpdateRequestCache метода из кода в моем вопросе, чтобы сделать каждый запрос перейти к кэшу:

private void onUpdateRequestCache(object sender, EventArgs e) 
{ 
    var application = (HttpApplication)sender; 

    application.Context.Response.Cache.SetCacheability(HttpCacheability.Public); //Location="Any" 
    application.Context.Response.Cache.SetExpires(DateTime.Now.AddSeconds(1800)); //Duration="1800" 
    application.Context.Response.Cache.SetValidUntilExpires(true); 
} 
Смежные вопросы