2016-02-12 10 views
3

Я хочу реализовать простой самообслуживаемый REST API в моем приложении WPF, который прослушивает конкретный порт на localhost. Этот API будет использоваться веб-сайтом для связи с приложением WPF, если он запущен.Самостоятельный REST API на localhost без административных привилегий

Не прошло много времени, прежде чем я столкнулся с ошибкой System.ServiceModel.AddressAccessDeniedException. URL-адрес должен быть зарезервирован, и это можно сделать только в том случае, если процесс выполняется с повышенными привилегиями. Проблема заключается в том, что это приложение используется тысячами компаний с различными политиками ИТ, что делает практически невозможным для приложения требовать административные привилегии при каждом запуске.

Это мой тестовый код:

_task = Task.Factory.StartNew(() => 
    { 
     var uri = new Uri("http://localhost:5000/test"); 
     var type = typeof (TestService); 
     WebServiceHost host = new WebServiceHost(type, uri); 
     WebHttpBinding binding = new WebHttpBinding(); 
     binding.CrossDomainScriptAccessEnabled = true; 
     host.AddServiceEndpoint(type, binding, uri); 
     host.Open(); 
    }); 

Есть ли способы обойти это? Какие-либо сторонние пакеты, которые я могу использовать? Или я могу зарезервировать URL-адрес во время установки приложения, так как для установки требуются повышенные привилегии? Или это тупик?

ответ

1

Вы получаете «доступ запрещен», потому что пытаетесь привязать его к http://+:12345, где + относится ко всем адресам на машине. Если вы явно привязаетесь к localhost, то (пока вы используете неиспользуемый номер порта) у вас не должно быть никаких проблем.

Это был (длинный), так как я последний раз использовал WCF, поэтому я не помню соответствующего заклинания для этого.

Лично я делал это, я бы изучил что-то вроде NancyFX, что намного проще в использовании, чем WCF, но, строго говоря, не поддерживает REST, поэтому вам нужно сложить что-то на Вверх. См., Например, http://engineering.laterooms.com/building-microservices-with-nancy-fx/.

И если вы решите использовать Нэнси с точки зрения прослушивания порта на локальном компьютере, не требуя прав администратора, вам нужно указать HostConfiguration.RewriteLocalhost в конфигурации (или, по крайней мере, вы сделали последний раз, когда я использовали NancyFX).

+0

Я обновил свое сообщение с помощью примера кода. Я привязываюсь к localhost: 5000/test. Спасибо за отзыв о NancyFX. Я посмотрю на это! – sundown

+0

Ах, вы можете _think_ вы привязываетесь к localhost. Дважды проверьте, что WCF не интерпретирует это как «все локальные адреса». Нэнси делает (или делает, когда я в последний раз ее использовал). –

+0

Итак, я попробовал Нэнси, и это сработало отлично! Было немного сложнее заставить его играть красиво с моим существующим контейнером Castle Windsor, но я решил это. Еще раз спасибо за ваш ответ! И всем остальным, я уверен, что здесь есть больше ответов, которые бы сработали. Но я решил отметить это как ответ. – sundown

0

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

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

3

Просто запустите это во время установки:

netsh http add urlacl url=http://+:5000/Test/ user=Everyone 

Примечание Вы можете ограничить user от Everyone до зарегистрированного пользователя, например, user=MyDomain\John

+1

Can = Should :) Используйте минимально необходимые привилегии, чтобы выполнить задание. По крайней мере, для не хобби проектов :) – cwap

 Смежные вопросы

  • Нет связанных вопросов^_^