Verwenden von Dienstendpunkten

Letzte Änderung: Dienstag, 15. Februar 2011

Gilt für: SharePoint Foundation 2010

Inhalt dieses Artikels
Unterstützte Protokolle
Definieren von Dienstendpunkten
Bereitstellen mehrerer Endpunkte
Definieren von Endpunkten im Dienstbereitstellungscode
Definieren von Endpunkten in der Clientkonfiguration
Definieren von Endpunkten im Proxycode

Die gesamte Kommunikation mit dem Windows Communication Foundation (WCF)-Dienst erfolgt über Dienstendpunkte. Ein Dienstendpunkt stellt einen Vertrag dar, in dem festgelegt ist, welche Methoden der Dienstklasse über den Endpunkt zugänglich sind. Jeder Endpunkt kann andere Methoden verfügbar machen. Die Endpunkte definieren außerdem eine Bindung, die angibt, wie ein Client mit dem Dienst kommuniziert und an welcher Netzwerkadresse sich der Endpunkt befindet.

Unterstützte Protokolle

Das Service Application Framework unterstützt alle WCF-Protokolle. Für Dienstendpunkte wird jedoch die Verwendung der Protokolle http und https empfohlen:

  • HTTP

  • HTTPS

    HinweisHinweis

    Vom Service Application Framework wird automatisch ein SSL-Zertifikat (Secure Sockets Layer) für die HTTPS-Dienstendpunkte installiert und konfiguriert. Dieses Zertifikat wird zwar im IIS-Manager nicht angezeigt, es ist aber installiert. Sie können dies nachprüfen, indem Sie an der Eingabeaufforderung folgenden Befehl eingeben:

    netsh http show sslcert ipport=0.0.0.0:32844

Definieren von Dienstendpunkten

Jeder von der WCF-Dienstanwendung unterstützte Endpunkt muss in den web.config-Einstellungen für die Anwendung definiert werden. Die Kombination aus Protokoll und Adresse muss für jeden Endpunkt eindeutig sein. Beispielsweise können zwei Endpunkte dieselbe Adresse aufweisen, wenn sie in ihrer jeweiligen Bindung unterschiedliche Protokolle angeben. Verwenden zwei Endpunkte hingegen dasselbe Protokoll, müssen sie unterschiedliche Adressen angeben.

Verwenden Sie für jeden Endpunkt eine eindeutige Endpunktadresse, die vom Bindungsprotokoll unabhängig ist. Geben Sie eine Endpunktadresse relativ zur Basisadresse des Service Application Framework an.

Verwenden Sie beispielsweise folgenden Code, um zwei Endpunkte mit relativen Adressen von "http" und "https" anzugeben.

<services>
    <service
        name="Microsoft.SharePoint.Test.SampleWebServiceApplication">
        <endpoint
          address="http"
          contract="Microsoft.SharePoint.Test.ISampleWebServiceContract"
          binding="customBinding"
          bindingConfiguration="SampleWebServiceHttpBinding" />
        <endpoint
          address="https"
          contract="Microsoft.SharePoint.Test.ISampleWebServiceContract"
          binding="customBinding"
          bindingConfiguration="SampleWebServiceHttpsBinding" />
      </service>
    </services>

Wenn im vorherigen Beispiel als Dienstbasisadresse http://machine:8080/application/calculator.svc verwendet wird, lauten die Endpunktadressen wie folgt:

http://machine:8080/application/calculator.svc/http

http://machine:8080/application/calculator.svc/https

Bereitstellen mehrerer Endpunkte

Eine Dienstanwendung kann zwei Endpunkte unterstützen: einen mit einer leistungsoptimierten Bindung (wenn sich beispielsweise der Netzwerkverkehr zwischen dem Front-End-Webserver und dem Anwendungsserver auf einem privaten LAN im Back-End befindet und keine Verschlüsselung erforderlich ist) und einen mit einer sicherheitsoptimierten Bindung (wenn der Netzwerkverkehr verschlüsselt werden muss). Das Service Application Framework stellt eine Benutzeroberfläche bereit, mit der Farmadministratoren den am besten geeigneten Endpunkt für die jeweilige Netzwerktopologie auswählen können. Administratoren können die Endpunktauswahl mithilfe der Option Veröffentlichen auf der Seite Dienstanwendungsverwaltung der Website für die Zentraladministration oder mithilfe des DefaultEndpoint-Parameters für das Windows PowerShell-Cmdlet Set-SPServiceApplication verwalten.

Definieren von Endpunkten im Dienstbereitstellungscode

Standardmäßig besitzt eine Webdienstanwendung einen einzigen HTTP-Endpunkt. Wenn diese Konfiguration Ihren Anforderungen für die Dienstanwendung entspricht, sind keine Änderungen erforderlich. Wenn Sie jedoch ein anderes Protokoll verwenden oder mehrere Endpunkte unterstützen möchten, müssen Sie alle von der Dienstanwendung unterstützten Endpunkte explizit definieren.

Verwenden Sie die AddServiceEndpoint-Methode von SPIisWebServiceApplication, wie im folgenden Beispiel gezeigt.

// Construct your SPIisWebServiceApplication derived class as usual.
MyWebServiceApplication app = new MyWebServiceApplication(…);

// Commit the new application to the configuration database.
// NOTE: Update must be called before AddServiceEndpoint.

// The service application must be committed to the configuration database before endpoints can be added.
app.Update();

// Add the endpoints supported by the application.
// NOTE: AddServiceEndpoint should be called before app.Provision, because app.Provision will provision 
// the default HTTP endpoint if no endpoints are explicitly added to the application.
// NOTE: The default endpoint name is always "http"
app.AddServiceEndpoint("", SPIisWebServiceBindingType.Http);

// Add an alternate HTTPS endpoint.
app.AddServiceEndpoint("secure", SPIisWebServiceBindingType.Https);

Der Endpunkt mit dem Namen http dient als Standardendpunkt für die Dienstanwendung. Der Dienstendpunktname muss eindeutig sein, selbst wenn die Endpunktadressen nicht eindeutig sind. Wenn Sie zwei Endpunkte mit derselben relativen Adresse verwenden, müssen Sie mit dem optionalen dritten Parameter AddServiceEndpoint die relative Adresse angeben. Der dritte Parameter entspricht standardmäßig dem Endpunktnamen.

Im folgenden Beispiel ist dargestellt, wie zwei Endpunkte an derselben Basisdienstadresse definiert werden, wobei der erste HTTP und der zweite HTTPS als Protokoll verwendet. Der https-Endpunkt befindet sich an der Basisdienstadresse "".

app.AddServiceEndpoint("", SPIisWebServiceBindingType.Http); 
// The default endpoint.
app.AddServiceEndpoint("https", SPIisWebServiceBindingType.Https, ""); 

Definieren von Endpunkten in der Clientkonfiguration

Jeder Endpunkt muss zusätzlich auch in der Clientkonfiguration definiert werden. Erstellen Sie eine Datei client.config mit denselben Bindungen wie in der Datei web.config für die Dienstanwendung. Jeder Clientendpunkt muss einen eindeutigen name-Attributwert aufweisen, damit vom Proxycode aus beim Lesen der Konfigurationsdatei auf ihn verwiesen werden kann, wie im folgenden Beispiel illustriert.

Die Konfigurationsnamen der Endpunkte in diesem Beispiel wurden so gewählt, dass sie den relativen Adressen des jeweiligen Dienstendpunkts entsprechen. Dies ist jedoch nicht obligatorisch.

<configuration>
  <system.serviceModel>
    <client>
      <endpoint
        name="http"
        contract="Microsoft.SharePoint.Test.ISampleWebServiceContract"
        binding="customBinding"
        bindingConfiguration="SampleWebServiceHttpBinding" />
      <endpoint
        name="https"
        contract="Microsoft.SharePoint.Test.ISampleWebServiceContract"
        binding="customBinding"
        bindingConfiguration="SampleWebServiceHttpsBinding" />
    </client>

Definieren von Endpunkten im Proxycode

Der Proxycode muss unter Verwendung der richtigen Endpunktkonfiguration eine Kanalfactory bilden. Die Endpunktkonfiguration wird namentlich angegeben (mit dem name-Attribut des endpoint-Clientkonfigurationselements). Zum Ermitteln des Endpunktkonfigurationsnamens sehen Sie sich den Endpunkt-URI an, bevor ein Kanal erstellt wird, und vergleichen Sie die relative Adresse mit den bekannten Endpunktadressen. Der Code zum Zwischenspeichern der Clientkanalfactory ist in folgendem Beispiel abgebildet. Wenn sich die Endpunktadressen nur durch das Protokoll unterscheiden, verwenden Sie zum Vergleich das URI-Schema.

private string m_EndpointConfigurationName;
private ChannelFactory<ISampleWebServiceContract> m_ChannelFactory;
private object m_ChannelFactoryLock = new object();

Rufen Sie jetzt den Endpunktkonfigurationsnamen für eine bestimmte Endpunktadresse ab.<param name="address">The endpoint address.</param>

GetEndpointConfigurationName gibt den Endpunktkonfigurationsnamen zurück. Der zurückgegebene Endpunktname muss einem der Endpunktelementnamen in der Datei client.config entsprechen.

private string GetEndpointConfigurationName(Uri address)
{
    if (null == address)
    {
        throw new ArgumentNullException("address");
    }
    if (address.Scheme == Uri.UriSchemeHttp)
    {
        return "http";
    }

    if (address.Scheme == Uri.UriSchemeHttps)
    {
        return "https";
    }
    return String.Empty;
}
private ISampleWebServiceContract GetChannel(Uri address)
{
    // Create an endpoint address for the service.
    EndpointAddress endpointAddress = new EndpointAddress(address); 

    // Get the endpoint configuration name.
    string endpointConfigurationName = GetEndpointConfigurationName(address); 
    // Check for a cached channel factory for the endpoint configuration.
    if ((null == m_ChannelFactory) || 
    (endpointConfigurationName != m_EndpointConfigurationName))
    {
        lock (m_ChannelFactoryLock)
        {
            if ((null == m_ChannelFactory) || 
               (endpointConfigurationName != m_EndpointConfigurationName))
            {

                // Create a channel factory
                // endpoint configuration name.
                m_ChannelFactory = 
                CreateChannelFactory<ISampleWebServiceContract>
                (endpointConfigurationName);
                // Store the current endpoint configuration name.
                m_EndpointConfigurationName = endpointConfigurationName;
            }
        }
    }
    // Create a channel from the channel factory.
    return m_ChannelFactory.CreateChannel(endpointAddress);
}
HinweisHinweis

Falls die Kanalfactory zwischengespeichert wird, müssen Sie den Cache ungültig machen.

Siehe auch

Konzepte

Erstellen von Service Application Framework-Webdiensten