Как создать прослушиватель HTTP-запросов Windows Service в .NET - PullRequest
4 голосов
/ 19 марта 2009

Я хочу создать службу Windows, которая действует как прослушиватель HTTP и может обрабатывать около 500 клиентов. Существуют ли какие-либо особые соображения для этого вида услуг.

Я немного запутался между классом HTTPListener и классом TCPListener. Какой из них использовать для службы Windows, которая будет:

  1. Принять клиентское соединение (около 500)
  2. Обработка клиентского запроса
  3. Позвоните в другой Http-сервис
  4. Вернуть некоторое значение вызывающему клиенту

Это то, что я делаю, чтобы запустить слушателя.

    listener = new HttpListener();
    listener.Prefixes.Add("http://localhost:8080/");
    listener.Start();
    listener.BeginGetContext(new AsyncCallback(OnRequestReceive), listener);

private void OnRequestReceive(IAsyncResult result)
{
     HttpListener listener = (HttpListener)result.AsyncState;
     // Call EndGetContext to complete the asynchronous operation.
     HttpListenerContext context = listener.EndGetContext(result);
     HttpListenerRequest request = context.Request;
} 

Смогу ли я обрабатывать N клиентов одновременно?

Ответы [ 4 ]

1 голос
/ 19 марта 2009

Если вам нужна высокая скорость отклика HttpListener не будет хорошо масштабироваться (вы не можете одновременно принимать более одного соединения). Но для мелкомасштабного использования, будьте осторожны, чтобы получить контекст и написать ответ асинхронно, это может сработать.

РЕДАКТИРОВАТЬ: Похоже, я неправильно понял HttpListener способность принимать подключения. Вы можете принять несколько соединений одновременно (см. Комментарий). Однако другие возможности IIS для размещения кода не позволят изобретать колесо. Так что, если нет особых требований, препятствующих IIS, почему бы не пойти по легкому пути?

Для серьезного использования используйте IIS, создав обработчик Http (класс, который реализует IHttpHandler или IHttpHandlerFactory, или даже IHttpAsyncHandler) для обработки запросов (это базовый тип, который реализует .aspx и др.).

Правильное решение действительно зависит от того, что вы подразумеваете под «обслуживать около 500 клиентов»: по одному или все сразу?

Исходя из ответа на комментарий: 500 сразу, и учитывая, что обработка на шаге 3 включает в себя еще один HTTP-вызов, я сомневаюсь, что использование HttpListner сможет справиться с нагрузкой, не гарантируя, что каждая операция асинхронна (получение контекста и запроса выполнение следующего HTTP-запроса и затем отправка ответа) ... что приведет к более сложному кодированию.

Если нет очень веской причины избегать IIS, использовать IIS будет проще, поскольку он предназначен для поддержки крупномасштабных загрузок клиентских запросов с расширенными функциональными возможностями, тогда как HttpListener «Предоставляет простой, программно управляемый прослушиватель протокола HTTP».

РЕДАКТИРОВАТЬ: расширен на основе более подробной информации о нагрузке.

0 голосов
/ 20 октября 2011

BeginGetContext принимает только один запрос. Вам нужно повторять асинхронный вызов каждый раз, когда вы получаете запрос, чтобы выполнить более одного запроса.

Некоторые люди упрощают свой дизайн, имея поток слушателя, который синхронно ожидает (то есть использует синхронный GetContext) в цикле. Это не очень хороший дизайн, так как в итоге вы ожидаете, что поток ждет (тратит ресурсы системы), но это может быть приемлемо, если вы не религиозны в отношении производительности / реализации концепции.

Вам также необходимо разместить вызов listener.Close () в методе закрытия службы. Тщательно синхронизируйте это с возможными асинхронными потоками, обрабатывающими запросы.

0 голосов
/ 05 апреля 2009

Я создал TcpListener и запустил слушатель, используя метод BeginAcceptTcpClient. Каждый входящий запрос передается в отдельный поток для обработки, где клиентское соединение постоянно используется для получения / отправки данных от клиента. Похоже, что он отлично работает для большого количества клиентов.

0 голосов
/ 19 марта 2009

Я бы использовал HttpListener класс. Он делает много вещей для вас, и вам не нужно изобретать велосипед. Также он интегрируется с драйвером режима ядра http.sys в Windows Server 2003 и должен обеспечивать более высокую производительность.

...