Чтение изображения с веб-сервера в прокси С#

Я пытаюсь написать прокси, который считывает изображение с одного сервера и возвращает его в предоставленный HttpContext, но я просто возвращаю поток символов.

Я пытаюсь сделать следующее:

WebRequest req = WebRequest.Create(image);
WebResponse resp = req.GetResponse();
Stream stream = resp.GetResponseStream();
StreamReader sr = new StreamReader(stream);
StreamWriter sw = new StreamWriter (context.Response.OutputStream);

sw.Write (sr.ReadToEnd());

Но, как я упоминал ранее, это просто ответ текстом.

Как мне сказать, что это изображение?

Изменить: я обращаюсь к этому с веб-страницы в исходном атрибуте тега img. Установка типа содержимого на application/octet-stream предлагает сохранить файл, а установка его на image/jpeg просто отвечает именем файла. Я хочу, чтобы изображение возвращалось и отображалось на вызывающей странице.


person Xetius    schedule 13.08.2009    source источник


Ответы (4)


Поскольку вы работаете с двоичным кодом, вам не нужно использовать StreamReader, который является текстовымчитателем!

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

const int BUFFER_SIZE = 1024 * 1024;

var req = WebRequest.Create(imageUrl);
using (var resp = req.GetResponse())
{
    using (var stream = resp.GetResponseStream())
    {
        var bytes = new byte[BUFFER_SIZE];
        while (true)
        {
            var n = stream.Read(bytes, 0, BUFFER_SIZE);
            if (n == 0)
            {
                break;
            }
            context.Response.OutputStream.Write(bytes, 0, n);
        }
    }
}
person John Saunders    schedule 13.08.2009
comment
Не могу отблагодарить вас достаточно. Полностью сводил меня с ума. - person Xetius; 13.08.2009
comment
Спасибо, это действительно помогло мне. Должен ли этот подход быть приемлемым для любого типа ответа — любой формы текста или двоичного кода? - person tomfumb; 22.12.2011
comment
Насколько это возможно, да. Конечно, для некоторых типов ответов вам может понадобиться установить заголовки и т. д. - person John Saunders; 22.12.2011

Думаю, вам нужно проверить ContentType возвращается вашим запросом WebResponse.

 if (resp.ContentType.StartsWith("image/"))
 {
   // Do your stuff
 }
person Dan Diplo    schedule 13.08.2009

Вам нужно будет установить тип контента для вашего ответа. Вот фрагмент кода, который это сделает:

// specify that the response is a JPEG
// Also could use "image/GIF" or "image/PNG" depending on what you're
// getting from the server
Response.ContentType = "image/JPEG";
person JustLoren    schedule 13.08.2009
comment
Это предлагает сохранить файл. Я использую это в теге img, поэтому хочу, чтобы он отображал изображение. - person Xetius; 13.08.2009

Я использую это в приложении в настоящее время. URL-адрес контента передается как значение строки запроса (URL-адрес изображения).

try
{
    if (ContentUrl != "")
    {
        string imgExtension = ContentUrl.Substring(ContentUrl.Length - 3, 3);
        switch (imgExtension)
        {
            case "":
                //image/bmp
                Response.ContentType = "image/bmp";
                break;

            case "jpg":
                //image/jpeg
                Response.ContentType = "image/jpeg";
                break;

            case "gif":
                //image/gif
                Response.ContentType = "image/gif";
                break;

            default:
                Response.ContentType = "image/jpeg";
                break;
        }

        if (!ContentUrl.StartsWith("http"))
            Response.BinaryWrite(new byte[] { 0 });

        WebClient wc = new WebClient();
        wc.Credentials = System.Net.CredentialCache.DefaultCredentials;
        Byte[] result;
        result = wc.DownloadData(ContentUrl);


        Response.BinaryWrite(result);

    }
}
catch (Exception ex)
{
    Utility.WriteEventError(Utility.EVENTLOG_SOURCE, string.Format("ImageProxy Error... Url:  {0}, Exception: {1}", ContentUrl, ex.ToString()));
}
finally
{
    Response.End();
}
person Jeremy Boyd    schedule 13.08.2009