Pergunta

Eu estou procurando uma maneira de usar um WCF WebServiceHost sem ter que confiar na classe HttpListener e está associado problemas de permissão (veja esta questão para detalhes).

Eu estou trabalhando em um aplicativo que se comunica localmente com outro aplicativo (de terceiros) através de sua API REST.

No momento estamos usando WCF como um servidor HTTP embutido. Criamos um WebServiceHost da seguinte forma:

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();

Tudo funciona bem, desde que o nosso aplicativo é executado como administrador. Se executar o nosso aplicativo em uma máquina sem privilégios administrativos do host.Open () irá lançar uma HttpListenerException com ErrorCode == 5 (ERROR_ACCESS_DENIED).

Nós podemos contornar o problema executando Httpcfg.exe a partir da linha de comando, mas esta é uma aplicação desktop de um clique e isso não é realmente como solução a longo prazo para nós.

Poderíamos abandonar WCF e escrever nosso próprio servidor HTTP, mas eu gostaria de evitar que se possível.

O que é a maneira mais fácil de substituir HttpListener com um soquete TCP padrão enquanto ainda estiver usando todos os restantes HTTP andaimes que WCF fornece?

Foi útil?

Solução

Você pode facilmente compor a sua própria pilha via CustomBinding, usando o material protocolo de nível superior "como está", e rolando sua própria versão de HttpTransport que não é apoiada por HttpListener ou IIS. Capaz de fazer, com certeza, mas é um monte de trabalho. Pegue os pedaços existentes HttpTransport distante com Reflector- há um monte de peças móveis lá dentro. Você provavelmente poderia cortar um PoC simples sobre o soquete em um dia ou dois, se você não precisa de nada extravagante como HTTPS ou chunking, mas tornando-se robusta vai ser complicado. Aqui 'sa boa wrapup de um monte de recursos (pode ser um pouco datado agora).

Outras dicas

Seu problema não está relacionado com HttpListener.

O seu problema é: * Você tem um aplicativo Oneclick com permissões limitadas que * tenta abrir uma porta do servidor.

Esta é uma contradição. Um pedido permissão limitada não confiável não deve abrir uma porta do servidor. É por isso que este não é permitido por definição.

Você já tentou abrir uma porta de soquete normal? Ele não deve funcionar.

Em geral, os aplicativos de usuário final Trust Limited não deve hospedar um serviço web;)

Dito isso, Eu tem sido em uma situação semelhante tentando usar WCF em um cenário de comunicação motorista - graças a Deus meus aplicativo é executado com permissão total

.

Você também pode olhar para rasgar o suficiente de Cassini para torná-lo hospedável em seu aplicativo e carregar o gasoduto WCF lá (via arquivos .svc eo manipulador de ativação do serviço) - que iria requerer escrevendo muito pouco novo código dessa forma, mas ainda dar-lhe um webserver bastante robusto e testado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top