Kann ein Webservicehost die Verwendung von Httplistener zu vermeiden geändert werden?

StackOverflow https://stackoverflow.com/questions/2417554

  •  19-09-2019
  •  | 
  •  

Frage

Ich bin auf der Suche nach einer Möglichkeit, ein WCF-Webservicehost zu verwenden, ohne auf der Httplistener Klasse verlassen zu müssen und es Erlaubnis Probleme (siehe diese Frage für Details).

Ich arbeite an einer Anwendung, die über ihren REST API lokal mit einer anderen (von Drittanbietern) Anwendung in Verbindung steht.

Im Moment haben wir WCF als eingebetteten HTTP-Server verwenden. Wir schaffen eine Webservicehost wie folgt:

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

Alles funktioniert gut, solange unsere Anwendung als Administrator ausgeführt wird. Wenn wir unsere Anwendung auf einer Maschine ohne Administratorrechte die host.Open () laufen eine HttpListenerException mit Error-Code == wirft 5 (ERROR_ACCESS_DENIED).

Wir können um das Problem zu umgehen, indem httpcfg.exe von der Kommandozeile ausgeführt wird, aber das ist eine Ein-Klick-Desktop-Anwendung und das ist nicht wirklich als langfristige Lösung für uns.

Wir können WCF Graben und unseren eigenen HTTP-Server schreiben, aber ich würde, dass, wenn möglich, vermeiden möge.

Was ist der einfachste Weg, Httplistener mit einem Standard-TCP-Socket zu ersetzen, während noch alle verbleibenden HTTP Gerüst verwenden, die WCF bietet?

War es hilfreich?

Lösung

Sie können Ihren eigenen Stapel über Custom, mit den höheren Level-Protokoll Sachen „wie sie ist“, und rollen Sie Ihre eigene Version von Httptransport leicht zusammensetzen, die nicht von Httplistener oder IIS unterstützt wird. Do-Lage, sicher, aber es ist eine Menge Arbeit. Nehmen Sie die vorhandenen Httptransport Bits auseinander mit Spiegel- gibt es eine Menge von Teilen dort zu bewegen. Sie könnten wahrscheinlich eine einfache PoC über Sockel an einem Tag zerhacken oder zwei, wenn Sie etwas brauchen keine Lust wie HTTPS oder Chunking, aber es macht robust wird schwierig sein. Hier ist eine gute wrapup einer Gruppe von Ressourcen (kann etwas veraltet jetzt werden).

Andere Tipps

Ihr Problem ist nicht im Zusammenhang mit Httplistener.

Ihr Problem ist: * Sie haben eine oneClick Anwendung mit begrenzten Berechtigungen * Versucht, einen Server-Port zu öffnen.

Das ist ein Widerspruch. Eine nicht vertrauenswürdige begrenzte Erlaubnis Anwendung sollte ein Server-Port öffnen. Aus diesem Grund wird diese nicht per Definition erlaubt.

Haben Sie versucht, einen normalen Socket-Port zu öffnen? Es sollte auch nicht.

In der Regel beschränkt Vertrauen Endbenutzer-Anwendungen sollten nicht ein Web-Service-Host;)

Das heißt, ich ahve in einer ähnlichen Situation versucht WCF in einem Treiber Kommunikationsszenario zu verwenden -. Gott sei Dank meine Anwendung läuft mit voller Berechtigung

Sie könnten auch einen Blick auseinander genug an Rippen Cassini es in der App machen Hostfähige und die WCF-Pipeline (über SVC-Dateien und den Dienstaktivierungs handler) in dort geladen - es würde erfordern sehr wenig neuen Code zu schreiben, dass die Art und Weise, aber immer noch gibt einen ziemlich robust und getestet Webserver.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top