2009-04-17 7 views
14

Ich habe einen WCF-Dienst, der über IIS auf mehreren Webservern gehostet wird. Ich habe eine Protokollierungsmethode, die die Aufrufe an die Datenbank protokolliert, und ich möchte protokollieren, auf welchem ​​Server der Aufruf ausgeführt wird.WCF: So erhalten Sie die Host-IP oder den Servernamen

Kann jemand den Host-Server-Namen oder die IP-Adresse abrufen, auf der der WCF-Aufruf ausgeführt wird?

Antwort

12

Verwenden Sie Dns.GetHostName(), weil es viel besser ist, den Namen des Computers als die Host-IP zu erhalten. Betrachten Sie den Fall, wenn Ihr Host-Computer mehr als eine IP-Adresse hat, virtuelle Netzwerkkarten (VMWare) hat.

1

Dns.GetHostName() ist was ich am meisten benutze.

5

Das hat bei uns funktioniert. Stellen Sie sicher, dass Sie einen Verweis auf System.ServiceModel haben. Dann implementieren Sie den folgenden Code in Ihre Service-Methode:

var context = System.ServiceModel.OperationContext.Current; 

RemoteEndpointMessageProperty property = (RemoteEndpointMessageProperty)context.IncomingMessageProperties[RemoteEndpointMessageProperty.Name]; 

string externalIP = property.Address; 
+4

Es ist Client-IP-Adresse, nicht Host. – berdem

1
Environment.MachineName 

tut axactly dass

0

DNS-Hostname funktioniert nicht, da viele Server mehrere Hostnamen haben, und Sie wissen nicht, welche die Service wurde angerufen. IIRC, IIS kann verschiedene Webdienste aufrufen, auf deren Basis der Hostname angegeben wurde, was die Angelegenheit verschlimmert. Die Verwendung von .Current ist großartig, wenn Sie keine einzelne Instanz ausführen. In diesem Fall haben Sie nicht immer ein Nicht-Null-Kontextobjekt, was für alle oben genannten Fälle gilt. Wenn jemand etwas festeres hat, bitte teilen :)

0

Sie können den folgenden Code verwenden, um die aktuelle Basisadresse des Servers (Host) zu erhalten.

using System.ServiceModel; 

var baseAddress = OperationContext.Current.Host.BaseAddresses[0].Authority; 
Verwandte Themen