У меня есть служба Windows.NET, которая порождает поток, который в основном просто действует как HttpListener
. Это работает нормально в примере с синхронным режимом...
private void CreateLListener()
{
HttpListenerContext context = null;
HttpListener listener = new HttpListener();
bool listen = true;
while(listen)
{
try
{
context = listener.GetContext();
}
catch (...)
{
listen = false;
}
// process request and make response
}
}
Проблема, которую я сейчас имею, это мне нужно, чтобы работать с несколькими запросами и отвечать на них одновременно или, по крайней мере, с перекрытием.
Чтобы объяснить далее - клиент - это приложение для медиаплеера, которое начинается с запроса на мультимедийный файл с свойством заголовка запроса Range bytes=0-
. Насколько я могу судить, он делает это, чтобы определить, что такое контейнер мультимедиа.
После того, как он прочитал "кусок" (или если он достаточно читал, чтобы определить тип носителя), он затем отправляет другой запрос (с другого номера сокета клиента) с помощью Range bytes=X-Y
. В этом случае Y - длина содержимого, возвращаемая в первом ответе, и X на 250000 байт меньше, чем это (обнаружено с использованием IIS в качестве теста). На этом этапе он получает последний "кусок", чтобы узнать, может ли он получить временную метку носителя для измерения длины.
Прочитав это, он делает еще один запрос с Range bytes=0-
(из другого номера сокета), чтобы начать корректную передачу медиафайла.
В любом случае, если пользователь клиента выполняет операцию "skip", он затем отправляет другой запрос (из еще одного номера сокета) с помощью Range bytes=Z-
, где Z - это позиция для перехода в медиафайл.
Я не очень хорошо разбираюсь в HTTP-материалах, но насколько я могу судить, мне нужно использовать несколько потоков для обработки каждого запроса/ответа, позволяя исходному HttpListener
вернуться к прослушиванию. Я много раз искал, но не могу найти подходящую модель.
EDIT:
Благодарность и благодарность Рику Страллу за следующий пример, который я смог адаптировать в соответствии с моими потребностями...
Добавьте веб-сервер в свое приложение .NET 2.0 с несколькими строками кода