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 <ENTER> 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:
"An exception occured: HTTP could not register URL http://+:8000/MyService/. Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/fwlinkId=70353 for details)."
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:
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"
xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!--Der folgende Eintrag muss angepasst werden-->
<requestedExecutionLevel level="requireAdministrator" />
</requestedPrivileges>
</security>
</trustInfo>
</asmv1:assembly>
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: