Отправка изображения с помощью HttpListener работает только для некоторых изображений - PullRequest
3 голосов
/ 11 января 2011

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

Отправка 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();
}

Ответы [ 3 ]

2 голосов
/ 11 января 2011

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

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

Кроме того, чтобы сделать метод 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();
}
1 голос
/ 11 января 2011

Можно попробовать заменить

http.Response.Close();

с

http.Response.Flush();
http.Response.End();
0 голосов
/ 11 января 2011

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

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

...