Отправка изображения с Httplistener работает только для некоторых изображений

StackOverflow https://stackoverflow.com/questions/4659708

  •  09-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь создать небольшую HTTP -прокси -сервис. Это не работает так хорошо. Он способен подавать HTML OKISH, однако он задыхается на изображениях. То есть некоторые изображения.

Отправка в URL через мой прокси доходность 19,4 КБ в ответе (согласно Firebug), посещая этот URL, также дает 19,4 т.п.н. в ответ, опять же, согласно Firebug. Разница в том, что она не появляется, когда я проведу его через свой прокси, но это происходит, когда я просматриваю напрямую.

Совершенно другой URL работает просто отлично. У кого -нибудь есть идеи?

private void DoProxy()
{
    var http = listener.GetContext();
    string url = http.Request.QueryString["url"];
    WebRequest request = HttpWebRequest.Create(url);
    WebResponse response = request.GetResponse();
    http.Response.ContentType = response.ContentType;

    byte[] content;
    using (Stream responseStream = response.GetResponseStream())
        content = ReadAll(responseStream);
    http.Response.ContentLength64 = content.Length;
    http.Response.OutputStream.Write(content, 0, content.Length);
    http.Response.Close();
}

private byte[] ReadAll(Stream stream)
{
    IList<byte> array = new List<byte>();
    int b;
    while ((b = stream.ReadByte()) != -1)
        array.Add(Convert.ToByte(b));
    return array.ToArray();
}
Это было полезно?

Решение

Я бы попытался промыть/закрыть OutputStream Прежде чем закрыть ответ.

Кроме того, в качестве второго предложения посмотрите на HTTP -трафик с исходного сайта, а затем через ваш прокси -сайт, используя HTTP Debugger Скрипач - Должно быть разница при использовании вашего прокси.

Кроме того, чтобы сделать метод Readall более эффективным, в целом я бы избежал загружать полное содержимое в память, потому что это взорвется на огромные файлы - просто транслируйте их непосредственно от потока ввода в выходной поток. Если вы все еще хотите использовать байтовые массивы, рассмотрите следующие (непроверенные, но должны работать):

private byte[] ReadAll(Stream stream)
{
    byte[] buffer = new byte[8192];
    int bytesRead = 1;
    List<byte> arrayList = new List<byte>();

    while (bytesRead > 0)
    {
        bytesRead = stream.Read(buffer, 0, buffer.Length);
        arrayList.AddRange(new ArraySegment<byte>(buffer, 0, bytesRead).Array);
    }
    return arrayList.ToArray();
}

Другие советы

Вы можете попытаться заменить

http.Response.Close();

с

http.Response.Flush();
http.Response.End();

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top