Я ищу способ использования 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?