Альтернатива 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.