2013-06-29 5 views
3

Я хотел использовать что-то вроде HttpServerUtility.Execute, чтобы выполнить IHttpHandler и написать ответ обработчика к MemoryStream, который затем может быть разобранной в ответ HTTP (функционально, я хочу доступ к заголовкам и содержание возвращается) ,Выполнить IHttpHandler для MemoryStream

В настоящее время метод HttpServerUtility.Execute имеет параметр для TextWriter объекта (может представлять собой StringWriter объекта), но это обслуживает только для запросов, которые возвращают текст/струнное тело, и я не могу прочитать содержание типа заголовка ответа (скажем, для ответа text/css). Если у меня есть обработчик, который я хотел выполнить, который выводит изображение, то StringWriter не будет работать, поскольку это касается двоичных данных.

В основном я хочу, чтобы выполнить одну IHttpHandler (может быть System.Web.UI.Page) внутри другого IHttpHandler и хранить ответ в MemoryStream.

Любая помощь с этим будет оценена по достоинству.

Спасибо.

+0

Вы уверены, что не получите все в предоставленном TextWriter? Класс HttpResponse проверяет, выводит ли он на стандартный HttpWriter или нет, и реагирует соответственно (байты должны быть записаны с использованием кодировки по умолчанию). Вы протестировали его? –

ответ

2

Возможно, вы можете вызвать метод ProcessRequest непосредственно из объекта IHttpHandler и передать его собственный контекст http с помощью собственного объекта ответа. Я не уверен, но я думаю, что метод BinaryWrite ответа HTTP использует выходной поток объекта TextWriter, который передается в его конструктор. Поэтому, если у вас есть поток памяти, установленный в TextWriter, вы можете использовать его в качестве вывода.

Итак:

  • Создать MemoryStream
  • Создать StreamWriter и передать поток памяти в конструкторе
  • Создать HttpResponse и передать его созданную StreamWriter
  • Создать HttpContext с созданным HttpResponse и созданный или текущий http-запрос
  • Invoke IHttpHandler.ProcessRequest
+0

Скорее всего, я попытаюсь сначала - с незначительной модификацией: создайте производный класс HttpWorkerRequest, чтобы инкапсулировать поток вашей памяти, улавливайте запись заголовка/тела в переопределениях для этого класса для маршрутизации на «MemoryStream», затем извлеките буфер, когда закончите - тогда вы создадите новый «HttpContext (HttpWorkerRequest wr)» и передаете его в «ProcessRequest». – JerKimball