Entwickler-Ecke

Verteilte Systeme - WCF: Problem beim hosten des Service als Windows Dienst


MHA - Fr 17.09.10 11:31
Titel: WCF: Problem beim hosten des Service als Windows Dienst
Hallo!

Ich habe einen ganz einfachen WCF Service erstellt. Dazu eine ConsolenApp als Host -> alles klappt wunderbar!
Nun hab ich einen Windows-Dienst erstellt, der das Hosting des Servic übernehmen soll, bis dahinn ist auch noch alles gut. Der Dienst startet und läuft, nur kann ich nun nicht mehr auf den Service zugreifen!

Hier mal zum besseren Verständnis meine app.config:


XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="FMServiceBehavior">
          <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8080/FMServiceMeta" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <ws2007HttpBinding>
        <binding name="wsReliableBinding">
          <reliableSession enabled="true" />
        </binding>
      </ws2007HttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="FMServiceBehavior" name="FMService.FMService">
        <clear />
        <endpoint address="FMService" binding="ws2007HttpBinding" bindingConfiguration="wsReliableBinding"
            name="FMServiceEndpoint" contract="FMService.IFMService" listenUriMode="Explicit" />
        <endpoint address="Mex" binding="mexHttpBinding" name="MexEndpoint"
            contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080" />
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>
</configuration>


Wenn der Service von der ConsoleApp gehostet wird, gebe ich zum testen im Browser ja nur "http://localhost:8080/" ein und es wird die Informationsseite angezeigt. Lass ich den Service aber durch den Dienst hosten (mit genau der selben app.config), kommt nur der Fehler: "Verbindung fehlgeschlagen....."

Es wäre schön, wenn jemand einen Tip für mich hat!


Ralf Jansen - Fr 17.09.10 12:05

Zitat:
gebe ich zum testen im Browser ja nur "http://localhost:8080/"


Eigentlich sollte nach deiner Konfiguration der Endpunkt "http://localhost:8080/FMService" sein.


MHA - Fr 17.09.10 12:47

Wenn ich im Browser "http://localhost:8080/FMService" angebe, kommt nur eine leere Seite. Bei "http://localhost:8080" kommt die Informationsseite des Service:

FMService Service

You have created a service.

To test this service, you will need to create a client and use it to call the service. You can do this using the svcutil.exe tool from the command line with the following syntax:

svcutil.exe "http://localhost:8080/FMServiceMeta?wsdl"

....


Das Problem ist ja, hoste ich den Service per Selfhosting, ist er erreichbar. Wird er aber mit selbiger Konfiguration per Windows-Dienst gehostet, kann ich ihn nicht mehr erreichen (weder per Client, noch per Browser)!


MHA - Fr 17.09.10 14:20

Ich glaube ich hab da was gefunden! Und zwar könnte es an der Http-Konfiguration liegen! Ich hab in der Ereignisanzeige einen Fehler ("....Could not register URL "http://+:8080/ ....") gefunden, welcher beim Dienststart passiert! Als Lösung hab ich das hier gefunden: http://blogs.msdn.com/b/anirbanc/archive/2008/05/14/wcf-error-http-could-not-register-url-http-8000-your-process-does-not-have-access-rights-to-this-namespace.aspx

Da kommt aber das nächste Problem in's Spiel: dieser SDDL-String erschließt sich mir nicht! Wie muss der aussehen, damit der http-Zugriff durch meinen Client auf die Url erlaubt wird???

Also: httpcfg set urlacl /u http://localhost:8080/ -aACL xxxxxxxx


MHA - Fr 17.09.10 14:40

Problem gelöst!

Hier http://blogs.msdn.com/b/paulwh/archive/2007/05/04/addressaccessdeniedexception-http-could-not-register-url-http-8080.aspx gibt es ein kleines Tool samt Quellen, dank dessen man einfach die Berechtigungen setzen kann. Wenn man nun "httpcfg.exe query urlacl" ausführt, kann man sich den generierten SDDL-String auch anssehen!