Непоследовательное поведение при сохранении PNG в Response.OutputStream - PullRequest
3 голосов
/ 13 октября 2010

Этот вопрос связан с этим вопросом: Невозможно отобразить изображение в HttpContext.Response.OutputStream . Это не дубликат.

При попытке сохранить PNG в Response.OutputStream я наблюдаю противоречивое поведение между локальной средой разработки и производственной средой. А именно, код, который я использовал, изначально работал нормально локально, но не работал на рабочем сервере.

Вот оригинальный код, который работал локально:

using (Bitmap bmp = challenge.RenderImage()) { 
    bmp.Save(context.Response.OutputStream, ImageFormat.Png); 
}

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

В GDI + произошла общая ошибка.

После некоторого копания я определил, что проблема была в том, что ' Сохранение изображения PNG требует доступного для поиска потока. ' - чем не является Response.OutputStream. Эту проблему легко устранить, сначала записав растровое изображение в System.IO.MemoryStream, а затем в Response.OutputStream.

using (Bitmap bmp = challenge.RenderImage()) {
    using(MemoryStream ms = new MemoryStream()) {
        bmp.Save(ms, ImageFormat.Png);
        ms.WriteTo(context.Response.OutputStream);
    }
}

Мне любопытно узнать, почему оригинальный код работал локально, но не работал на рабочем сервере? Причины сбоя кода кажутся мне черно-белыми, поэтому я не понимаю, почему может существовать несоответствие, связанное с окружающей средой.

1 Ответ

0 голосов
/ 13 октября 2010

Теоретически вы можете реализовать свой собственный поток для поиска и добавить его в качестве фильтра в свой атрибут Response.Filter, так что, возможно, Кассини делает что-то подобное изнутри. Это пример подключения вашего собственного потока: http://www.ericis.com/2007/6/21/Obtaining%20ResponseOutputStreamLength

...