HttpListenerResponse и бесконечное значение для его свойства ContentLength64

У меня возникла проблема с проксированием http-потока.

Во-первых: я создаю сервер потоковой передачи мультимедиа по протоколу http с проигрывателем VLC.

Во-вторых: я прослушиваю http-запросы на одном порту с помощью HttpListener и пытаюсь переслать ответ с порта сервера vlc в качестве ответа от первого.

Прокси:

Client            Server(:1234)                         VLC(:2345)
       -request-> HttpListener
                  HttpWebRequest           -request->
                  HttpWebResponse         <-response-
                 Stream <=Copy= Stream
      <-response- HttpListenerResponse

Все работает нормально. Но все же есть одна проблема. Я пытаюсь скопировать прямую трансляцию в HttpListenerResponse. Но я не могу добавить отрицательное значение к его свойству ContentLength64. Свойство HttpWebResponse ContentLength имеет значение -1. Это должно быть значение для бесконечной длины контента.

Это необходимо, потому что я перенаправляю прямую трансляцию.

void ProxyRequest(HttpListenerResponse httpResponse)
{
    HttpWebRequest HttpWReq = (HttpWebRequest)WebRequest.Create("http://localhost:2345");
    HttpWebResponse HttpWResp = (HttpWebResponse)HttpWReq.GetResponse();

    // this must be >=0. Throws ArgumentOutOfRangeException "The value specified for a set operation is less than zero."
    httpResponse.ContentLength64 = HttpWResp.ContentLength;

    byte[] buffer = new byte[32768];
    int bytesWritten = 0;
    while (true)
    {
        int read = HttpWResp.GetResponseStream().Read(buffer, 0, buffer.Length);
        if (read <= 0)
            break;
        httpResponse.OutputStream.Write(buffer, 0, read);
        bytesWritten += read;
    }
}

У кого-нибудь есть решение этой проблемы?


person vellotis    schedule 13.11.2011    source источник
comment
Пробовали ли вы Fiddler ( fiddler.wikidot.com/fiddlercore & fiddler2.com/fiddler2 ) Это тоже может быть полезно   -  person L.B    schedule 14.11.2011
comment
Думал, что установка для SendChunked значения true решит мою проблему. social.msdn.microsoft.com/Forums/en-US/clr/thread/   -  person vellotis    schedule 14.11.2011


Ответы (1)


Решением должно стать установка для свойства SendChunked значения true и удаление присвоенного значения ContentLength64. Как это описано в вашей предоставленной ссылке.

void ProxyRequest(HttpListenerResponse httpResponse)
{
    HttpWebRequest HttpWReq = (HttpWebRequest)WebRequest.Create("http://localhost:2345");
    HttpWebResponse HttpWResp = (HttpWebResponse)HttpWReq.GetResponse();

    // Solution!!!
    httpResponse.SendChunked = true;

    byte[] buffer = new byte[32768];
    int bytesWritten = 0;
    while (true)
    {
        int read = HttpWResp.GetResponseStream().Read(buffer, 0, buffer.Length);
        if (read <= 0)
            break;
        httpResponse.OutputStream.Write(buffer, 0, read);
        bytesWritten += read;
    }
}
person hs2d    schedule 14.11.2011
comment
Спасибо, что указали на это. Я сам что-то напутал. Оно работает! - person vellotis; 14.11.2011