Mam usługę Windows .NET, która spawnuje wątek, który zasadniczo działa jak HttpListener
. To działa poprawnie w trybie synchronicznym przykład ...Obsługa wielu żądań za pomocą C# 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
}
}
Problem mam teraz jest mi to potrzebne do pracy z wieloma wnioskami i ich odpowiedzi na jednoczesne lub przynajmniej w nakładany sposób.
Aby wyjaśnić dalej - klient jest aplikacją odtwarzacza multimediów, która rozpoczyna się od żądania pliku multimedialnego z właściwością nagłówka żądania Range bytes=0-
. O ile wiem, robi to, aby ustalić, co to jest kontener mediów.
Po przeczytaniu "kawałka" (lub jeśli został odczytany wystarczająco, aby potwierdzić rodzaj nośnika), wysyła kolejne żądanie (z innego numeru gniazda klienta) z numerem Range bytes=X-Y
. W tym przypadku Y to długość treści zwrócona w pierwszej odpowiedzi, a X jest 250000 bajtów mniejsza od tej (wykryta przy użyciu IIS jako testu). Na tym etapie uzyskuje się ostatni "kawałek", aby sprawdzić, czy może uzyskać znacznik czasu mediów, aby zmierzyć długość.
Po przeczytaniu tego, wysyła kolejne żądanie z numerem Range bytes=0-
(z innego numeru gniazda), aby rozpocząć przesyłanie strumieniowe pliku multimedialnego prawidłowo.
W każdym momencie, jeśli użytkownik klienta wykona operację "pominięcie", wówczas wysyła kolejne żądanie (z innego numeru gniazda) z Range bytes=Z-
, gdzie Z jest miejscem do przeskoczenia do pliku multimedialnego.
Nie jestem zbyt dobry z materiałami HTTP, ale z tego co wiem, muszę użyć wielu wątków, aby obsłużyć każde żądanie/odpowiedź, jednocześnie pozwalając, aby oryginalny HttpListener
powrócił do słuchania. Zrobiłem dużo wyszukiwania, ale nie mogę znaleźć modelu, który wydaje się pasować.
EDIT:
Uznanie i wdzięczność Rick Strahl na poniższym przykładzie, który udało mi się dostosować do moich potrzeb ...
Add a Web Server to your .NET 2.0 app with a few lines of code
Doskonały sposób na zrobienie tego, ale radzenie sobie z programowaniem Async będzie lepiej serwerować –