WCF – self-hosting in a Windows Service

Încercând azi sa creez un Windows Service care expune un serviciu WCF m-am lovit de următoarea eroare la serviceHost.Open():

Service cannot be started. System.ServiceModel.AddressAccessDeniedException: HTTP could not register URL http://+:8008/MyServiceName/. Your process does not have access rights to this namespace … System.Net.HttpListenerException: Access is denied

Problema e comună și binecunoscută celor ce lucrează frecvent cu WCF self-hosted, dar..

Cum încercam să rulez Windows Service-ul sub un cont de Network Service, care nu e admin, Windows-ul spune ceva de genul: “nu ai drepturi destule să rezervi acel namespace”.
Soluția (pe Vista, Win7 si Win2008) e relativ simplă: logat ca adminstrator (cmd / Run as Admin..), invocăm formula magică:

C:\windows\system32>netsh http add urlacl url=http://+:8008/MyServiceName/ user="NT AUTHORITY\NETWORKSERVICE"

fără spațiu in NETWORKSERVICE (cu spațiu pare-se nu merge pe sisteme care nu au English locale). Normal, o comandă de genul ăsta ar trebui inclusă cumva într-un installer, care de obicei e rulat de un admin.

Mai multe detalii la: http://msdn.microsoft.com/en-us/library/ms733768.aspx
și mai in detaliu, inclusiv o metodă de a face asta din cod (ugly code): http://msdn.microsoft.com/en-us/magazine/cc163531.aspx

Morala: să nu hostez servicii WCF altfel decât in IIS, decât daca e musai.. 🙂

Advertisements
This entry was posted in .NET, WCF, WCF and tagged , , . Bookmark the permalink.

4 Responses to WCF – self-hosting in a Windows Service

  1. Andrei Ignat says:

    Parerea mea despre WCF in IIS e impartita – imi place mai mult WebService decit echilibristica ca WCF sa aiba access la (Session/Cache/Application) din IIS.

  2. Tudor Turcu says:

    Foarte rar am avut nevoie intr-un serviciu WCF sa accesez Session/Cache/Application-ul din ASP.NET – cel mult, rar, cand se punea problema de interoperabilitate cu servicii .asmx legacy..
    Altfel, pentru cache folosesc AppFabric cache sau alt framework third-party, de ASP.NET session nu simt nevoiea cat timp imi gandesc serviciile stateless (exista WCF sessions, dar sunt o alta mancare de peste).
    Singurul avantaj la web serviciile .asmx din ASP.NET era simplitatea in configurare, ceea ce au incercat sa inbunantateasca in .NET 4.0 si la WCF…

  3. alexpascanu says:

    folosind netsh trebuie sa dai drepturi lui network serv ca sa poate asculta pe diferiteporturi cam asa se procedeaza in situatiile astea

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s