HttpListener хорошо работает на Mono? - PullRequest
20 голосов
/ 27 мая 2010

Я ищу небольшой веб-сервис для запуска на небольшом Linux-компьютере. Я предпочитаю кодировать на C #, поэтому я хочу использовать Mono.

Я не хочу использовать полнофункциональный веб-сервер или версию ASP.NET для Mono. Я думаю о единственном процессе с потоком, имеющим дело с каждым клиентским соединением. Общая память между потоками вместо базы данных.

Я немного прочитал о версии HttpListener от Microsoft и о том, как она работает с драйвером Http.sys. Увы, документация Mono для этого класса - это просто автоматизированный интерфейс класса без обсуждения того, как он работает под капотом. (В Linux нет Http.sys, поэтому я думаю, что он реализован существенно по-другому.)

Может ли кто-нибудь указать мне на некоторые ресурсы, обсуждающие этот модуль, пожалуйста?

Большое спасибо, Билл, billpg.com

(Небольшая предыстория моего вопроса для интересующихся.)

Некоторое время назад я задал этот вопрос , заинтересованный в том, чтобы вести долгий разговор с большим количеством вопросов. Я решил разработать собственный протокол ad-hoc, но люди, с которыми я общался, действительно хотели REST-интерфейс, даже за счет сигнала «Хорошо, пошли свою команду сейчас».

Итак, я задумался о запуске ASP.NET на сервере Linux / Mono, но наткнулся на HttpListener. Это казалось идеальным, поскольку каждый «разговор» мог проходить в отдельном потоке. Поток, который вызывает HttpListener в цикле, может найти, для какого потока предназначено каждое входящее соединение, и передать ссылку на этот поток.

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

Ответы [ 2 ]

26 голосов
/ 18 июня 2010

Привет, Класс HttpListener в Mono работает без особых проблем. Я думаю, что наиболее существенным отличием его использования в среде MS от среды Linux является то, что порт 80 не может быть связан без безопасности root / su / sudo. Другие порты не имеют этого ограничения. Например, если вы укажете префикс: http://localhost:1234/, HttpListener будет работать как положено. Однако, если вы добавите префикс http://localhost/, который вы ожидаете прослушивать через порт 80, он молча завершится неудачей. Если вы явно пытаетесь подключиться к порту 80 (http://localhost:80/), то вы бросаете исключение. Если вы вызываете свое приложение как суперпользователь или root, вы можете явно привязать к порту 80 (http://localhost:80/).
Я еще недостаточно подробно изучил остальные члены HttpListener, чтобы сделать какие-либо полезные комментарии о том, как он работает в среде Linux. Однако, если будет интерес, я продолжу публиковать свои наблюдения.

chickenSandwich

2 голосов
/ 29 мая 2010

Я не уверен, почему вы хотите заглянуть так глубоко в капюшон. Даже на стороне Microsoft документы о http.sys могут не дать вам действительно ценной информации, если вы используете .NET Framework.

Чтобы узнать, работает ли что-то на Mono достаточно хорошо, вы всегда должны загружать образ VMware или VPC и тестировать на нем свои приложения.

http://www.go -mono.com / моно-загрузки / download.html

Хотя Mono гораздо более зрелый, чем несколько лет назад, мы не можем сказать, что он был протестирован достаточным количеством реальных приложений, таких как Microsoft.NET. Поэтому, пожалуйста, протестируйте свои заявки и отправьте обнаруженные проблемы команде Mono.

Исходя из моего опыта, мелкие проблемы устраняются в течение нескольких дней, а для серьезных проблем требуется больше времени. Но с доступным исходным кодом Mono вы можете исправить самостоятельно или найти обходные пути в большинстве случаев.

...