Как потоковое изображение байтового массива? - PullRequest
2 голосов
/ 06 июня 2011

По какой-то странной причине в пятилетнем внутреннем веб-приложении asp.net , используемом через IE6 , неожиданно возникла проблема, даже несмотря на то, что не было никаких изменений кода.Некоторые изображения, которые передаются обратно в веб-браузер, не отображаются для некоторых пользователей.

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

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

Response.Clear();
Response.ClearHeaders();
Response.ClearContent();        

// Work out file type
switch( Path.GetExtension( imageFilename ).ToLower() )
{
    case ".jpg":
    case ".jpeg":
        Response.ContentType = "image/jpeg";
        break;
    case ".gif":
        Response.ContentType = "image/gif";
        break;
    default:
        Response.ContentType = "binary/octet-stream";
        break;  
}

Response.AddHeader("Content-Length", imageBytes.Length.ToString() );
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.BinaryWrite( imageBytes );
Response.End();

Вместо изображения, отображаемого на странице, отображается красный крест.Это происходит только с динамически сгенерированными изображениями, отображаемыми на странице, а не со статически связанными изображениями.

Если я пытаюсь открыть изображение в своем собственном окне, я либо вижу изображение, либо загружаем текст в виде пустякаТо, что я предполагаю, означает, что тип MIME не устанавливается / не принимается браузером)

Ответы [ 2 ]

1 голос
/ 06 июня 2011

Response.End() обычно плохо, поскольку прерывает поток IIS, даже если он находится в середине Flush () - ing.

Используйте Response.Flush(), а затем Response.Close(), чтобы убедиться, что все содержимое отправлено клиенту.

0 голосов
/ 06 июня 2011

Я могу ошибаться, но я думаю, что Content-Length должен содержать длину тела в байтах. Response.BinaryWrite будет base64 кодировать данные, которые будут длиннее, чем длина byte[], указанная вами, в заголовке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...