Tags: | Posted by AlexanderZeitler on 12/14/2007 8:52 AM | Comments (0)

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:

"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)."

WCFConsoleHostProcessAccessRightsError

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:

VSElevated

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:

ServiceHostElevated

Ein nützliches Tool in diesem Zusammenhang, um die Berechtigungen des Users nicht per netsh setzen zu müssen, ist der HttpNamespaceManager:

HttpNsManager

Comments are closed