Подтвердить что ты не робот

Хорошо ли работает HttpListener в Mono?

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

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

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

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

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

(Немного о моем вопросе для заинтересованных.)

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

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

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

4b9b3361

Ответ 1

Привет,  Класс 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

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

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

http://www.go-mono.com/mono-downloads/download.html

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

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