2010-03-02 3 views
7

Ähnlich wie die Visual Studio-Entwicklungswebserver (Cassini) Einschränkung, dass es nur auf localhost Server betreibt, habe ich eine WCF-Dienst-Implementierung, die nur auf localhost benötigt wird.Konfigurieren von WCF für nur LOCALHOST-Listening

Ich hätte nichts dagegen, dass andere Computer Zugriff haben, außer dass die Windows-Firewall das Programm auffordert, dem externen NIC zuzuhören. Da dies nur intern benötigt wird, würde ich eher die WCF Server-seitige Konfiguration einschränken, so dass der Firewall-Detektor nicht ausgelöst wird.

Ist binding.HostNameComparisonMode = HostNameComparisonMode.Exact die richtige Lösung? Ich sehe nicht, wie das genug ist.

====

wie Cassini, diese Service-Implementierung ist ein Stand-in für etwas anderes, die Netzwerk-Kommunikation erfordert. Der Client kann so konfiguriert werden, dass er sich mit dem echten Server oder der falschen Implementierung verbindet, die auf localhost ausgeführt wird.

Antwort

0

Es hängt davon ab, wie Sie es hosten. Wenn Sie sich in IIS7 oder WAS befinden, verwendet WCF den Übereinstimmungsmodus von IIS. Wenn Sie andernfalls verwenden, dann ist der Hostname immer ein kritischer Faktor beim Abgleich. Wenn der Hostname nicht übereinstimmt, schlägt der Versand im Allgemeinen fehl.

Es sollte beachtet werden, dass genau ist nicht 100% perfekt genau ... es erlaubt immer noch einige Variation in den Host-Namen. Wenn Sie sowohl einen NetBIOS-Hostnamen als auch einen vollständigen DNS-Namen haben, wird der Abgleich dennoch ausgeführt, da WCF diese beiden als ein und dasselbe behandelt.

System.ServiceModel.BasicHttpBinding.HostNameComparisonmode

+0

Ich habe die Bindung ausprobiert.HostNameComparisonMode = HostNameComparisonMode.Exact erneut und es funktioniert nicht. Nachdem die entsprechenden Windows-Firewall-Regeln gelöscht wurden, fordert die Firewall erneut auf, sie zuzulassen. –

+0

Ich habe auch eine 'neue Uri (" net.tcp: // localhost ")' als Basisadresse für den ServiceHost-Konstruktor –

+0

hinzugefügt Nun, es scheint, dass die Firewall Sie unabhängig davon, ob es ein Loopback-Host oder ist nicht. Ich bin mir nicht sicher, ob Sie irgendetwas anderes dagegen tun können, als Named Pipes zu benutzen. – jrista

6

Ich denke, dass Sie es in die falsche Richtung nähern. Sie sollten die Named Pipe-Bindung verwenden, die das von Ihnen verwendete Nachrichtenaustauschmuster unterstützen sollte (es unterstützt Request-Response sowie dieselben Modi für Parallelität und Sitzungsstatus, die von WS unterstützt werden).

Aus dem Abschnitt von MSDN Titel "Choosing a Transport" (Hervorhebung von mir):

Wann verwendet man die Named Pipe-Transport

Eine Named Pipe ist ein Objekt im Windows-Betriebssystem-Kernel, wie als ein Abschnitt des gemeinsamen Speichers, den Prozesse für die Kommunikation verwenden können. Eine Named Pipe hat einen Namen und kann für Einweg- oder Duplex-Kommunikation zwischen Prozessen auf einer einzelnen Maschine verwendet werden.

Wenn die Kommunikation zwischen den verschiedenen WCF-Anwendungen auf einen einzelnen Computer erforderlich ist, und Sie möchten verhindern jegliche Kommunikation von einem anderen Maschine, dann ist die Transportrohre genannt verwenden. Eine zusätzliche Einschränkung ist, dass Prozesse von Windows Remote Desktop auf der gleichen Windows-Remotedesktop-Sitzung Sitzung ausgeführt werden können, sofern sie keine erhöhten Berechtigungen haben.

Dies erfüllt Ihre genauen Anforderungen und sollte nicht mehr als eine Konfigurationsänderung sein.

+0

Einverstanden; "localhost only" ist wirklich "interprocess communication" und named pipes sind die besten dafür. – Randolpho

+0

Entschuldigung - ich werde klarstellen: Wie Cassini ist diese Service-Implementierung ein Ersatz für etwas anderes, das eine Netzwerkkommunikation erfordert. Der Client kann so konfiguriert werden, dass er sich mit dem echten Server oder der falschen Implementierung verbindet, die auf localhost ausgeführt wird. –

+0

@Jason: Wenn der Client konfiguriert werden kann, warum sollte er nicht so konfiguriert werden, dass er einen Named Pipe-Endpunkt anstelle eines Http-Endpunkts verwendet? Da WCF in der Lage ist, beides zu tun, und einen Dienst über Pipe vs. HTTP anzurufen, ist das gleiche für WCF ... warum sollten Sie sich mit etwas anderem beschäftigen? – jrista