#c# #video-streaming #vlc #httpwebresponse #httplistener
#c# #потоковое видео #vlc #httpwebresponse #httplistener
Вопрос:
Я столкнулся с проблемой с проксированием http-потока.
Во-первых: я создаю сервер потоковой передачи мультимедиа по протоколу http с VLC плеером.
Второе: я прослушиваю http-запросы на одном порту с помощью HttpListener и пытаюсь переслать ответ с порта vlc-сервера в качестве ответа от первого.
Прокси:
Client Server(:1234) VLC(:2345)
-request-> HttpListener
HttpWebRequest -request->
HttpWebResponse <-response-
Stream <=Copy= Stream
<-response- HttpListenerResponse
Все работает нормально. Но все же есть одна проблема. Я пытаюсь скопировать прямую трансляцию в HttpListenerResponse. Но я не могу добавить отрицательное значение к его свойству ContentLength64. Свойство ContentLength HttpWebResponse имеет значение -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;
}
}
Есть ли у кого-нибудь решение этой проблемы?
Комментарии:
1. Вы пробовали Fiddler( fiddler.wikidot.com/fiddlercore amp; fiddler2.com/fiddler2 ) Это тоже может быть полезно
2. Думал, что установка SendChunked в true решит мою проблему. social.msdn.microsoft.com/Forums/en-US/clr/thread /…
Ответ №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;
}
}
Комментарии:
1. Спасибо, что указали на это. Я сам кое-что напутал. Это работает!