2009-08-18 2 views
4

Я написал HttpModule, который я использую для перехвата, вызывает обработчик WebResource.axd, поэтому я могу выполнить некоторую пост-обработку на javascript.Фильтр HttpResponse ничего не возвращает

Модуль обертывает поток Response.Filter для выполнения его обработки и записывает его изменения в базовый поток.

Проблема заключается в том, что сценарий не возвращается в браузер.

Так как очень простой пример, который просто действует как проход через модуль выглядит следующим образом:

public class ResourceModule : IHttpModule 
{ 
    public void Dispose() 
    { 
    } 

    public void Init(HttpApplication context) 
    { 
     context.PostRequestHandlerExecute += new EventHandler(context_PostRequestHandlerExecute); 
    } 

    void context_PostRequestHandlerExecute(object sender, EventArgs e) 
    { 
     HttpApplication context = sender as HttpApplication; 

     if (context.Request.Url.ToString().Contains("WebResource.axd")) 
     { 
      context.Response.Filter = new ResourceFilter(context.Response.Filter); 
     } 
    } 
} 

и ResourceFilter, что просто выводит то, что он получает, выглядит так:

public class ResourceFilter : MemoryStream 
{ 
    private Stream inner; 

    public ResourceFilter(Stream inner) 
    { 
     this.inner = inner; 
    } 

    public override void Write(byte[] buffer, int offset, int count) 
    { 
     inner.Write(buffer, offset, count); 
    } 
} 

Я могу прикрепить и посмотреть, как вызывается модуль и фильтр, но когда я просматриваю URL-адрес WebResource.axd, я ничего не получаю.

Я использовал этот шаблон для реализации модулей, которые выполняют обработку на страницах aspx, и они работают нормально. Похоже, что есть что-то о взаимодействии с WebResource.axd, которое мешает этому работать.

ответ

5

Я сделал небольшой проект и точно воссоздал вашу проблему. Я запускал скрипач, чтобы хорошо рассмотреть ответ, в том числе заголовки, и обнаружил, что он был только в фильтрах на * .axd-файлах, где это произошло.

После некоторого поиска я нашел this статью Дэниела Ричардсона, у которой была такая же проблема.

Оказывается, что System.Web.Handlers.AssemblyResourceLoader (который проходит через оси) устанавливает флаг, чтобы игнорировать дальнейшие записи.

Даниил дает пример использования отражения, чтобы снять этот флаг и позволить фильтру работать с результатом axd. Я попробовал, и он работает хорошо. Лучше иметь в виду какое-либо влияние на производительность, но, как говорит Дэниел, реализации ASP.NET могут измениться.

+0

Если кто-то заинтересован в коде, чтобы установить флаг ложной : 'поле FieldInfo = _webStream.GetType() BaseType.GetField ("_ писатель", BindingFlags.NonPublic | BindingFlags.Instance);' ' вар автор = field.GetValue (_webStream),' ' FieldInfo ignoringWrites. = writer.GetType(). GetField ("_ ignoringFurtherWrites", BindingFlags.NonPublic | BindingFlags.Instance); ' ' ignoringWrites.SetValue (writer, false); ' – avidenic

1

Основываясь на моем опыте, фильтр должен быть «зацепил» в случае PreRequestHandlerExecute самое позднее, чтобы заставить его работать в версии IIS старше версии 7.

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

  • Нет связанных вопросов^_^