Можно ли изменить WebServiceHost, чтобы избежать использования HttpListener? - PullRequest
1 голос
/ 10 марта 2010

Я ищу способ использования WCF WebServiceHost без необходимости полагаться на класс HttpListener и связанные с ним проблемы с разрешениями (подробности см. в этом вопросе ).

Я работаю над приложением, которое локально связывается с другим (сторонним) приложением через их REST API.

В настоящее время мы используем WCF в качестве встроенного HTTP-сервера. Мы создаем WebServiceHost следующим образом:

String hostPath = "http://localhost:" + portNo;
WebServiceHost host = new WebServiceHost(typeof(IntegrationService), new Uri(hostPath));

// create a webhttpbinding for rest/pox and enable cookie support for session management
WebHttpBinding webHttpBinding = new WebHttpBinding();
webHttpBinding.AllowCookies = true;

ServiceEndpoint ep = host.AddServiceEndpoint(typeof(IIntegrationService), webHttpBinding, "");

host.Open()

ChannelFactory<IIntegrationService> cf = new ChannelFactory<IIntegrationService>(webHttpBinding, hostPath);
IIntegrationService channel = cf.CreateChannel();

Все работает хорошо, пока наше приложение запускается от имени администратора. Если мы запустим наше приложение на машине без прав администратора, host.Open () сгенерирует исключение HttpListenerException с ErrorCode == 5 (ERROR_ACCESS_DENIED).

Мы можем обойти эту проблему, запустив httpcfg.exe из командной строки, но это настольное приложение одним щелчком мыши, и для нас это не столь долгосрочное решение.

Мы могли бы отказаться от WCF и написать свой собственный HTTP-сервер, но я бы хотел этого избежать, если это возможно.

Какой самый простой способ заменить HttpListener стандартным сокетом TCP, при этом все еще используя все остальные HTTP-леса, предоставляемые WCF?

Ответы [ 3 ]

2 голосов
/ 10 марта 2010

Ваша проблема не связана с HttpListener.

Ваша проблема: * У вас есть приложение oneClick с ограниченными разрешениями, которое * Пытается открыть порт сервера.

Это противоречие. Ненадежное приложение с ограниченными разрешениями не должно открывать порт сервера. Вот почему это не разрешено по определению.

Вы пытались открыть нормальный порт сокета? Это тоже не должно работать.

Как правило, приложения конечного пользователя с ограниченным доверием не должны размещать веб-службы;)

Тем не менее, я был в подобной ситуации, пытаясь использовать WCF в сценарии взаимодействия с драйверами - слава богу, мое приложение запускается с полным разрешением.

1 голос
/ 12 марта 2010

Вы можете легко составить свой собственный стек через CustomBinding, используя высокоуровневые протоколы «как есть» и развернув собственную версию HttpTransport, которая не поддерживается HttpListener или IIS. Выполнимо, конечно, но это много работы. Разберите существующие биты HttpTransport вместе с Reflector - там МНОГО движущихся частей. Вы могли бы, вероятно, взломать простой PoC через Socket через день или два, если вам не нужно ничего такого, как HTTPS или чанкинг, но сделать его надежным будет непросто. Здесь - хорошее обобщение множества ресурсов (возможно, немного устаревшее).

0 голосов
/ 13 марта 2010

Вы также можете посмотреть, как достаточно разорвать Cassini , чтобы сделать его размещаемым в вашем приложении, и загрузить туда конвейер WCF (через файлы .svc и обработчик активации службы) - для этого потребуется Таким образом, вы пишете очень мало нового кода, но при этом получаете достаточно надежный и проверенный веб-сервер.

...