28 Stimmen

WCF Service Endpunkte vs. Host Basisadresse

Ich bin also ein wenig verwirrt, wofür die Service-Endpunkte und die Host-Basisadresse sind. In allen Beispielen, die ich bisher durchgegangen bin, wird über die Einrichtung der Endpunkte mit den erforderlichen Bindungen gesprochen und man kann normalerweise zu diesen Endpunkten navigieren

Wenn ich jedoch die folgende Konfiguration verwende, um meinen Dienst einzurichten und zu hosten, scheint es nur die Basisadresse des Hosts zu zeigen.

    <configuration>
      <system.web>
        <compilation debug="true" />
      </system.web>
      <!-- When deploying the service library project, the content of the config file must be added to the host's
      app.config file. System.Configuration does not support config files for libraries. -->
      <system.serviceModel>
        <services>
          <service name="HostService.EvalService">
            <endpoint address="http://localhost:8080/basic"
              binding="basicHttpBinding" contract="HostService.IEvalService" />
            <endpoint address="http://localhost:8080/ws"
              binding="wsHttpBinding" contract="HostService.IEvalService" />
            <endpoint address="mex" binding="mexHttpBinding"
              name="mex" contract="IMetadataExchange" />
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8080/EvalsService" />
              </baseAddresses>
            </host>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="">
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>

Kann mir das jemand erklären?

38voto

Kiran Mothe Punkte 685

Wenn Sie den WCF-Dienst auf IIS hosten, kann die Basisadresse nur die URL zur .svc-Datei sein. Wenn Sie eine andere Basisadresse angeben, wird diese ignoriert. Sie können trotzdem den relativen URI für Ihre Endpunkte angeben, z. B. address="basic" ou address = "ws" . Dann wird die Adresse am Endpunkt <URL to the .svc file>/basic y <URL to the .svc file>/ws in diesem Fall.

22voto

Hasan Punkte 676

Wenn Sie die Endpunktadresse leer lassen, bedeutet dies, dass der Endpunkt einfach die entsprechende Basisadresse für seine Endpunktadresse verwendet. Alternativ können Sie die Basisadresse als absoluten Pfad Ihres Dienstes konfigurieren oder, was noch besser ist, relative Adressen für Ihre Endpunkte schreiben.

Wenn Sie Ihre Dienste auf IIS hosten, wird die Basisadresse des Dienstes durch das virtuelle IIS-Verzeichnis zusammen mit der .svc-Datei bestimmt.

Angenommen, Sie haben eine Datei mit dem Namen calc.svc und legen sie in einem virtuellen Verzeichnis ab, das dem Verzeichnis "http://localhost:8080/calcservice" entspricht. Die Basisadresse für diesen Dienst ist dann "http://localhost:8080/calcservice/calc.svc".

IIS zwingt Ihre Endpunkte, diese Basisadresse zu verwenden, die entsprechend dem Pfad für die Dienstbereitstellung festgelegt wurde. Wenn Sie eine andere Basisadresse als das entsprechende virtuelle Verzeichnis angeben, erhalten Sie eine Ausnahme.

Betrachten Sie die folgende Konfiguration;

<configuration>
    <system.serviceModel>
        <services>
            <service name="CalculatorService">
              <!-- base address determined by IIS virtual directory -->
              <endpoint binding="basicHttpBinding" contract="ISimpleMath"/>
              <endpoint address="secure" binding="wsHttpBinding" contract="ISimpleMath"/>
              <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>
        ...

... die Adresse des ersten Endpunkts wird die gleiche wie die Basisadresse ('http://localhost:8080/calcservice/calc.svc'), da ich die Endpunktadresse leer gelassen habe. Die Adresse des zweiten Endpunkts wird die Kombination aus der Basisadresse und dem Zusatz "secure", etwa so: 'http://localhost:8080/calcservice/calc.svc/secure'. Und die Adresse des "mex"-Endpunkts ist "http://localhost:8080/calcservice/calc.svc/mex". Dies kann einigen Leuten etwas seltsam vorkommen, da der relative Teil der Adresse rechts vom Dateinamen angehängt wird, aber Sie müssen bedenken, dass calc.svc Teil der Basisadresse ist und daher so funktionieren muss.

Auch wenn Sie kann nicht navigieren zu den "../mex"- oder "../secure"-URLs über den Browser, sind sie tatsächlich aktiv und die Clients können diese Adressen konsumieren.

Kundenverhalten

Die Kunden kennen die Basisadresse des Dienstes nicht und haben keinen Bedarf, etwas Ähnliches auf ihrer Seite der Leitung zu unterstützen. Daher werden Sie im clientseitigen Objektmodell oder im Konfigurationsabschnitt nichts finden, was mit Basisadressen zu tun hat. Clients wählen einfach einen bestimmten Endpunkt, der immer mit einer absoluten Adresse konfiguriert ist, und diese absolute Adresse bestimmt die Adresse, die während der Übertragung verwendet wird.

Die obigen Informationen stammen größtenteils aus dem hervorragenden Buch von Aaron Skonnard artículo auf msdn. Ich empfehle Ihnen dringend, es zu lesen, um die Grundlagen der WCF-Adressierung zu verstehen.

6voto

Jack Punkte 707

Wenn Sie die Basisadresse verwenden, müssen Sie keine absolute URI für Ihre Endpunkte angeben, Sie können zum Beispiel address="basic" im Abschnitt Endpunktkonfiguration, bedeutet dies, dass die Adresse für diesen Endpunkt http://localhost:8080/EvalsService/basic .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X