Domanda

Sto cercando un modo per utilizzare un WCF WebServiceHost senza dover contare sulla classe HttpListener ed è associato problemi di permessi (vedi questa domanda per i dettagli).

Sto lavorando su un'applicazione che comunica localmente con un'altra applicazione (di terzi) tramite il loro API REST.

Al momento stiamo utilizzando WCF come un server HTTP integrato. Creiamo un WebServiceHost come segue:

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

Tutto funziona bene fintanto che la nostra applicazione viene eseguito come amministratore. Se lanciamo la nostra applicazione su una macchina senza privilegi di amministratore del host.Open () genera un HttpListenerException con ErrorCode == 5 (ERROR_ACCESS_DENIED).

possiamo aggirare il problema eseguendo Httpcfg.exe dalla riga di comando ma questo è un applicazione desktop con un clic e che non è proprio la soluzione più a lungo termine per noi.

Si potrebbe fosso WCF e scrivere il nostro server HTTP, ma vorrei evitare che, se possibile.

Qual è il modo più semplice per sostituire HttpListener con una presa standard TCP pur utilizzando tutti i restanti ponteggi HTTP che fornisce WCF?

È stato utile?

Soluzione

Si può facilmente comporre il proprio stack di via customBinding, utilizzando la roba protocollo di livello più alto "come è", e rotolare la propria versione di HttpTransport che non è supportato da HttpListener o IIS. Do-in grado, certo, ma è un sacco di lavoro. Prendere i bit esistenti HttpTransport parte con Reflector- ci sono un sacco di parti in movimento lì. Si potrebbe probabilmente incidere un semplice PoC su Socket in un giorno o due, se non avete bisogno di qualcosa di fantasia, come HTTPS o suddivisione in blocchi, ma che lo rende robusto sarà difficile. Qui 'una buona wrapup di un gruppo di risorse (può essere un po' datato ora).

Altri suggerimenti

Il problema non è legato alla HttpListener.

Il problema è: * Si dispone di un'applicazione OneClick con autorizzazioni limitate che * Tenta di aprire una porta del server.

Questa è una contraddizione. Un'applicazione non attendibile il permesso limitato non dovrebbe aprire una porta SERVER. Questo è il motivo per cui questo non è consentito per definizione.

Hai provato l'apertura di una normale porta socket? Non dovrebbe funzionare.

In generale, limitate applicazioni degli utenti finali fiducia non dovrebbe ospitare un servizio web;)

Detto questo, ho ahve stato in una situazione simile cercando di utilizzare WCF in uno scenario di comunicazione conducente -. Grazie al cielo la mia applicazione funziona con piena autorizzazione

Si potrebbe anche guardare strappo abbastanza parte di Cassini per renderlo hostable nella vostra applicazione, e caricando il gasdotto WCF in là (tramite file .svc e il gestore di attivazione del servizio) - che sarebbe bisogno di scrivere molto poco nuovo codice in questo modo, ma ancora dare un webserver abbastanza robusto e collaudato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top