Альтернатива HttpListener?

Я разрабатываю приложение, которое до сих пор использует HttpListener для предоставления небольшого автономного http-сервера. Тем не менее, я недавно обнаружил, что HttpListener должен запускаться как Администратор, что не всегда будет возможно.

Какая будет лучшая альтернатива? Мне нужны http GET и POST, оба из которых - это не просто чтение/запись файлов в файловой системе, им нужно запустить собственный .Net-код.

Мои исследования до сих пор воспитывали Кассини, но, насколько я могу судить, мне пришлось бы написать собственную версию. Есть ли еще что-нибудь? В partyular что-то с тем же интерфейсом, что и HttpListener, но это не требует привилегий администратора, было бы потрясающе!

Ответы

Ответ 1

Одна из альтернатив, которую я нашел, - С# Webserver в CodePlex.

"... гибкий HTTP-сервер, который может быть встроен в любое приложение .NET. Он имеет модульную структуру, в которой функции добавляются с использованием модулей. Сервер также поддерживает REST и все http-глаголы..."

У него есть класс HttpListener, который, как мне кажется, похож на System.Net.HttpListener, но я не использовал ни одного из них, но я не могу быть уверен.

Ответ 2

Одним из решений этого вопроса является этот другой вопрос - вы можете дать себе разрешения на запуск HttpListener как не-администратора.

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

Ответ 3

Как и комментарий Will Dean в вашем сообщении, вы можете запустить следующую команду netsh:

netsh http add urlacl url=http://+:8346/ user="NTAuthority\Authenticated Users" sddl="D:(A;;GX;;;AU)"

Замените "http://+: 8346/" вашим значением, и это позволит любому аутентифицированному пользователю запустить веб-сервер в конечной точке назначения.

Ответ 4

Относительно утверждения:

Недавно я обнаружил, что HttpListener должен запускаться как Администратор

Это не совсем так, и некоторые другие ответы касаются одной из причин, но есть и другое:

  • Отмечено другими плакатами: вы можете предоставить разрешения для не-Администратора. Отлично, но не очень.
  • Вы можете прослушивать локальный хост, даже на порту 80, без администратора. Примечание. Я помню, что работает только "localhost", а не "127.0.0.1"... поэтому убедитесь, что вы передаете localhost вашему вызову Prefixes.Add.

Мы отправляем внутренний инструмент, который позволяет разработчикам запускать хост на базе HTTP на своих ПК, и мы сначала подумали, что использование HttpListener было бы невозможным из-за проблемы с Администратором (или с разрешениями администратора), но затем мы обнаружили, что localhost работает отлично, не будучи администратором. Это имеет смысл: прослушивание снаружи "опасно", но прослушивание на локальной машине не так опасно.

Ответ 5

Итак, у вас есть обычное настольное приложение, которое должно разрешать входящие HTTP-соединения - хм - не будет ли брандмауэр Windows проблемой?

Предполагая, что это не похоже на веб-сервис - не могли бы вы пойти по этому маршруту - вы можете просмотреть URL-адреса через это? Хотя мои знания .Net недостаточно глубоки, чтобы знать, нужно ли все-таки запускать определенный HTTP-сервер для ответа на запросы. Spring.Net, вероятно, стоит посмотреть.

Ответ 6

Nowin - отличная библиотека, которая может быть интегрирована в Owin как ServerFactory без зависимости на HttpListener. Можно было заменить замену Microsoft.Owin.Host.HttpListener lib без заминки

Ответ 7

Для приложений .NET Core существует новая (кроссплатформенная) реализация HTTP-сервера: Kestrel.