2010-03-10 5 views
1

HttpListener 클래스에 의존하지 않고 WCF WebServiceHost를 사용하는 방법을 찾고 있는데 권한 관련 문제가 있습니다 (자세한 내용은 this question 참조).HttpListener를 사용하지 않도록 WebServiceHost를 변경할 수 있습니까?

저는 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()은 ErrorCode == 5 (ERROR_ACCESS_DENIED) 인 HttpListenerException을 발생시킵니다.

우리는 명령 줄에서 httpcfg.exe를 실행하여 문제를 해결할 수 있지만 이는 원 클릭 데스크톱 응용 프로그램이며 실제로는 장기적인 해결책이 아닙니다.

우리는 WCF를 도려내고 우리 자신의 HTTP 서버를 작성할 수 있지만 가능한 경우이를 피하고 싶습니다.

WCF가 제공하는 나머지 모든 HTTP 스캐 폴딩을 사용하면서 HttpListener를 표준 TCP 소켓으로 대체하는 가장 쉬운 방법은 무엇입니까?

+0

ErrorCode == 5 (ERROR_ACCESS_DENIED) : "netsh http urlacl"은 HTTP Listener의 예비 주소에 대한 액세스 권한을 부여하는 방법입니다. –

답변

1

"있는 그대로"의 상위 수준 프로토콜을 사용하여 CustomBinding을 통해 자신의 스택을 쉽게 구성 할 수 있으며 HttpListener 또는 IIS가 지원하지 않는 고유 한 버전의 HttpTransport를 롤링 할 수 있습니다. 할 수 있겠지만,하지만 그것은 많은 일입니다. Reflector를 사용하여 기존 HttpTransport 비트를 분리하십시오. 거기에는 많은 이동 부품이 있습니다. HTTPS 나 청크처럼 멋진 것은 필요 없다면 하루나 이틀 만에 간단한 PoC를 해킹 할 수 있습니다. 그러나 강력하게 만드는 것은 까다로울 것입니다. Here님께서는 많은 자료를 제공하고 있습니다 (현재 날짜가 조금 다를 수 있음).

+0

링크를 가져 주셔서 감사합니다 - 이것은 제가 온 결론입니다. 안타깝게도 (HttpChannelListener, HttpTransportManager 등)에서 파생시키려는 거의 모든 클래스는 내부 용으로 표시되어 사용자가 맞습니다. 엄청난 재 구현이 필요합니다. Ho hum. –

+0

우리는 프리 사이징 (pre-exising) 서비스 계약을 이해할 수있는 저의 작은 HTTP 서버를 사용하기 시작했습니다. 내부 클래스와 개인 메서드의 대량 WCF 구현을 너무 많은 시간이 소모, 부끄럽게 만들었습니다. –

+0

동의 - 나는 WCF REST가 우리에게 넘어졌고, 우리가 변경해야했던 한 가지 사실이 HttpTransport에서 가치가 있기에 너무 깊숙한 곳에서 비슷한 것을했습니다. 내부 멤버를 조정하여 디버거에서 작동하도록 만들 수도 있지만 실제로는 그렇게 할 방법이 없습니다. – nitzmahone

2

문제는 HttpListener와 관련이 없습니다.

문제 : * 제한된 권한을 가진 oneClick 응용 프로그램이 있습니다. * 서버 포트를 열려고 시도합니다.

이것은 모순입니다. 신뢰할 수없는 제한된 권한 응용 프로그램은 서버 포트를 열지 않아야합니다. 이것이 정의마다 허용되지 않는 이유입니다.

정상적인 소켓 포트를 열어 보았습니까? 그것도 작동해서는 안됩니다. 웹 서비스를 호스팅하지 말아야 일반적으로 제한된 신뢰 최종 사용자 응용 프로그램에서

) 말했다

, 나는 드라이버 통신 시나리오에서 WCF를 사용하려고 비슷한 상황에 있었다 ahve - 내 응용 프로그램이 함께 실행 천국 감사합니다 전체 허가.

+0

당신이 말한 것을 고맙게 생각하지만, 나는 이것을 두 번 점검했고 이것들은 정상적인 청취 소켓을 열 수있다. 문제는 HttpListener와 특히 관련이 있습니다. 아마도 악성 응용 프로그램이 다른 포트와 동일한 포트에서 실행될 수 있기 때문입니다 (따라서 트래픽이 방화벽 내부에 들어올 수 있습니다. http://www.leastprivilege.com/HttpCfgACLHelper.aspx 참조). 몇 가지 자세한 내용은). 실제로 우리는 응용 프로그램을 배포하는 방법에 관계없이 제한된 사용자로 실행할 때 동일한 문제가 발생하며이를 수행하기위한 많은 이유가 있습니다. –

0

Cassini도 충분히 찢어서 앱에서 호스팅하고 .svc 파일 및 서비스 활성화 핸들러를 통해 WCF 파이프 라인을로드 할 수 있습니다. 새 코드를 거의 작성하지 않아도됩니다. 그런 식으로,하지만 여전히 당신에게 상당히 강력하고 테스트를 거친 웹 서버를 제공합니다.

관련 문제