Ein WCF ServiceHost in einer Konsolen-Applikation ist schnell eingetippt:
string hostIP = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0].ToString();
#if CLIENT_DISCOVERY_BUILD
Uri address = new Uri(string.Format("http://localhost:8000/myservice", hostIP));
#else
Uri address = new Uri(string.Format("http://{0}:8000/myservice", hostIP));
#endif
ServiceHost serviceHost = new ServiceHost(typeof(MyService), address);
try {
serviceHost.AddServiceEndpoint(typeof(IMyService),
new BasicHttpBinding(),
"MyService");
#if CLIENT_DISCOVERY_BUILD
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
serviceHost.Description.Behaviors.Add(smb);
#endif
serviceHost.Open();
Console.WriteLine(
string.Format("MyService is running at {0})", address.ToString()));
Console.WriteLine("Press to terminate");
Console.ReadLine();
serviceHost.Close();
}
catch (CommunicationException ce) {
Console.WriteLine("An exception occured: {0}", ce.Message);
serviceHost.Abort();
Console.ReadLine();
}
Startet man den Host nun via F5 aus Visual Studio, erhält man unter Windows Vista folgende Fehlermeldung:
Klickt man auf den o.g. Link ("70353"), kommt man relativ schnell zu folgender (vermeintlichen) Lösung:
Kommandozeile als Administrator ausführen und folgende Befehl absetzen:
netsh http add urlacl url=http://+:8000/MyService user=MYDOMAIN\MyUser
Danach startet man voller Erwartungen den ServiceHost per F5-Taste erneut und - die gleiche Fehlermeldung erscheint.
Der Grund hierfür ist, dass der WCF-Prozess außerdem Administrator-Rechte benötigt.
Um dies zu gewährleisten und den bekannten Permit / Deny Dialog zu öffnen, muß dem Projekt eine .Manifest-Datei hinzugefügt werden ("Add New Item" / "Application Manifest File" / "app.Manifest"), die wie folgt aussieht:
Startet man nun den Host nochmals per F5, erscheint folgende Meldung:
Klickt man nun auf "Restart under different credentials", startet Visual Studio nach der entsprechenden Bestätigung als Administrator. Nach dem erneuten Laden der Solution startet der Service Host nun wie gewünscht:
Ein nützliches Tool in diesem Zusammenhang, um die Berechtigungen des Users nicht per netsh setzen zu müssen, ist der HttpNamespaceManager: