Migrieren von WSE 3.0-Webdiensten zu WCF

Die Vorteile des Migrierens von WSE 3.0-Webdiensten zu Windows Communication Foundation (WCF) umfassen verbesserte Leistung und die Unterstützung zusätzlicher Transporte, zusätzlicher Sicherheitsszenarien und WS-*Spezifikationen. Bei einem Webdienst, der von WSE 3.0 zu WCF migriert wird, kann eine Leistungsverbesserung von bis zu 200 % bis 400 % auftreten. Weitere Informationen über die Transporte, die von WCF unterstützt werden, finden Sie unter Wählen eines Transports. Eine Liste der Szenarien, die von WCF unterstützt werden, finden Sie unter Häufige Sicherheitsszenarien. Eine Liste der Spezifikationen, die von WCF unterstützt werden, finden Sie unter Handbuch für die Interoperabilität von Webdienstprotokollen.

Die folgenden Abschnitte bieten eine Anleitung für das Migrieren eines bestimmten Features eines WSE 3.0-Webdiensts zu WCF.

Allgemein

WSE 3.0 und WCF-Anwendungen umfassen Interoperabilität auf niedriger Ebene und eine Standardmenge an Terminologie. WSE 3.0 und WCF-Anwendungen sind auf niedriger Ebene interoperabel auf der Grundlage eines Satzes von WS-*Spezifikationen, den beide unterstützen. Wenn eine WSE 3.0- oder WCF-Anwendung entwickelt wird, gibt es einen Standardsatz an Terminologie, wie die Namen von sofort verwendbaren Sicherheitsassertionen in WSE und die Authentifizierungsmodi.

Obwohl es viele ähnliche Aspekte zwischen den Programmiermodellen von WCF und ASP.NET oder WSE 3.0 gibt, sind sie unterschiedlich. Details zum WCF-Programmiermodell finden Sie unter Grundlegender Programmierlebenszyklus.

Tipp

Für die Migration eines WSE-Webdiensts zu WCF kann das ServiceModel Metadata Utility Tool (Svcutil.exe)-Tool verwendet werden, um einen Client zu generieren. Der Client enthält jedoch Schnittstellen und Klassen, die auch als Startpunkt für einen WCF-Dienst verwendet werden können. Bei den generierten Schnittstellen wird das OperationContractAttribute-Attribut auf die Member des Vertrags angewendet, wobei die ReplyAction-Eigenschaft auf * festgelegt ist. Wenn ein WSE-Client einen Webdienst mit dieser Einstellung aufruft, wird die folgende Ausnahme ausgelöst: Web.Services3.ResponseProcessingException: WSE910: Bei der Verarbeitung einer Antwortnachricht ist ein Fehler aufgetreten. Sie können den Fehler in der inneren Ausnahme suchen. Um dies abzuschwächen, legen Sie für die ReplyAction-Eigenschaft des OperationContractAttribute-Attributs einen Nicht-NULL-Wert fest, wie z. B. http://Microsoft.WCF.Documentation/ResponseToOCAMethod.

Sicherheit

WSE 3.0-Webdienste, die mit einer Richtliniendatei gesichert werden

WCF-Dienste können mithilfe einer Konfigurationsdatei einen Dienst sichern. Dieser Mechanismus funktioniert ähnlich wie eine WSE 3.0-Richtliniendatei. Wenn Sie in WSE 3.0 einen Webdienst mit einer Richtliniendatei sichern, verwenden Sie entweder eine sofort verwendbare Sicherheitsassertion oder eine benutzerdefinierte Richtlinienassertion. Dem Authentifizierungsmodus eines WCF-Sicherheitsbindungselements werden die sofort verwendbaren Sicherheitsassertionen eng zugeordnet. Es werden nicht nur die WCF-Authentifizierungsmodi und die sofort verwendbaren WSE 3.0-Sicherheitsassertionen gleich oder ähnlich benannt, sondern sie sichern die Nachrichten unter Verwendung derselben Anmeldeinformationstypen. So wird z. B. wird die sofort verwendbare usernameForCertificate-Sicherheitsassertion in WSE 3.0 dem UsernameForCertificate-Authentifizierungsmodus in WCF zugeordnet. Die folgenden Codebeispiele zeigen, wie eine minimale Richtlinie, die die sofort verwendbare usernameForCertificate-Sicherheitsassertion in WSE 3.0 verwendet, einem UsernameForCertificate-Authentifizierungsmodus in WCF in einer benutzerdefinierten Bindung zugeordnet wird.

WSE 3.0

<policies>
  <policy name="MyPolicy">
    <usernameForCertificate messageProtectionOrder="SignBeforeEncrypt"
                            requireDeriveKeys="true"/>
  </policy>
</policies>

WCF

<customBinding>
  <binding name="MyBinding">
    <security authenticationMode="UserNameForCertificate" 
              messageProtectionOrder="SignBeforeEncrypt"
              requireDerivedKeys="true"/>
  </binding>
</customBinding>

Um die Sicherheitseinstellungen eines WSE 3.0-Webdiensts, die in einer Richtliniendatei festgelegt sind, zu WCF zu migrieren, muss eine benutzerdefinierte Bindung in einer Konfigurationsdatei erstellt und die sofort anwendbare Sicherheitsassertion auf den entsprechenden Authentifizierungsmodus festgelegt werden. Darüber hinaus muss die benutzerdefinierte Bindung für die Verwendung der WS-Adressing-Spezifikation vom August 2004 konfiguriert werden, wenn WSE 3.0-Clients mit dem Dienst kommunizieren. Wenn der migrierte WCF-Dienst keine Kommunikation mit WSE 3.0-Clients erfordert und nur die Sicherheitsparität verwalten muss, sollten Sie die systemdefinierten WCF-Bindungen mit entsprechenden Sicherheitseinstellungen verwenden, statt eine benutzerdefinierte Bindung zu erstellen.

In der folgenden Tabelle ist die Zuordnung zwischen einer WSE 3.0-Richtliniendatei und der entsprechenden benutzerdefinierten Bindung in WCF aufgelistet.

Sofort verwendbare WSE 3.0 Sicherheitsassertion Konfiguration einer benutzerdefinierten WCF-Bindung

<usernameOverTransportSecurity />

<customBinding>
  <binding name="MyBinding">
    <security authenticationMode="UserNameOverTransport" />
    <textMessageEncoding messageVersion="Soap12WSAddressingAugust2004" />
  </binding>
</customBinding>

<mutualCertificate10Security />

<customBinding>
  <binding name="MyBinding">
    <security messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10" authenticationMode="MutualCertificate" />
    <textMessageEncoding messageVersion="Soap12WSAddressingAugust2004" />
  </binding>
</customBinding>

<usernameForCertificateSecurity />

<customBinding>
  <binding name="MyBinding">
    <security authenticationMode="UsernameForCertificate"/>
    <textMessageEncoding messageVersion="Soap12WSAddressingAugust2004" />
  </binding>
</customBinding>

<anonymousForCertificateSecurity />

<customBinding>
  <binding name="MyBinding">
    <security authenticationMode="AnonymousForCertificate"/>
    <textMessageEncoding messageVersion="Soap12WSAddressingAugust2004" />
  </binding>
</customBinding>

<kerberosSecurity />

<customBinding>
  <binding name="MyBinding">
    <security authenticationMode="Kerberos"/>
    <textMessageEncoding messageVersion="Soap12WSAddressingAugust2004" />
  </binding>
</customBinding>

<mutualCertificate11Security />

<customBinding>
  <binding name="MyBinding">
    <security authenticationMode="MutualCertificate"/>
    <textMessageEncoding messageVersion="Soap12WSAddressingAugust2004" />
  </binding>
</customBinding>

Weitere Informationen zum Erstellen benutzerdefinierter Bindungen in WCF finden Sie unter Benutzerdefinierte Bindungen.

WSE 3.0-Webdienste, die mit einem Anwendungscode gesichert werden

Unabhängig davon, ob WSE 3.0 oder WCF verwendet wird, können die Sicherheitsanforderungen im Anwendungscode statt in der Konfiguration festgelegt werden. Bei WSE 3.0 wird dies durch Erstellen einer Klasse, die sich von der Policy-Klasse ableitet, und dann durch Hinzufügen der Anforderungen durch Aufrufen der Add-Methode erreicht. Weitere Details über das Festlegen von Sicherheitsanforderungen im Code finden Sie unter Gewusst wie: Sichern eines Webdiensts ohne Verwendung einer Richtliniendatei (möglicherweise in englischer Sprache). Um bei WCF Sicherheitsanforderungen im Code festzulegen, erstellen Sie eine Instanz der BindingElementCollection-Klasse und fügen eine Instanz eines SecurityBindingElement zu der BindingElementCollection hinzu. Die Anforderungen an die Sicherheitsassertionen werden mit den statischen Hilfsmethoden des Authentifizierungsmodus der SecurityBindingElement-Klasse festgelegt. Weitere Details über das Festlegen von Sicherheitsanforderungen im Code mit WCF finden Sie unter Gewusst wie: Erstellen einer benutzerdefinierten Bindung mit dem SecurityBindingElement und Gewusst wie: Erstellen eines SecurityBindingElement für einen angegebenen Authentifizierungsmodus.

Benutzerdefinierte WSE 3.0-Richtlinienassertion

Bei WSE 3.0 gibt es zwei Typen von benutzerdefinierten Richtlinienassertionen: solche, die eine SOAP-Nachricht sichern, und solche, die keine SOAP-Nachricht sichern. Richtlinienassertionen, die SOAP-Nachrichten sichern, werden von der WSE 3.0-SecurityPolicyAssertion-Klasse abgeleitet. Das konzeptuelle Äquivalent in WCF ist die SecurityBindingElement-Klasse.

Beachten Sie unbedingt, dass die sofort anwendbaren WSE 3.0-Sicherheitsassertionen eine Teilmenge der WCF-Authentifizierungsmodi sind. Wenn Sie in WSE 3.0 eine benutzerdefinierte Richtlinienassertion erstellt haben, kann es einen entsprechenden WCF-Authentifizierungsmodus geben. WSE 3.0 stellt z. B. keine CertificateOverTransport-Sicherheitsassertion bereit, die der sofort anwendbaren UsernameOverTransport-Sicherheitsassertion entspricht, verwendet aber ein X.509-Zertifikat für Clientauthentifizierungszwecke. Wenn Sie eine eigene benutzerdefinierte Richtlinienassertion für dieses Szenario festgelegt haben, macht WCF die Migration einfach. WCF definiert einen Authentifizierungsmodus für dieses Szenario, sodass Sie die statischen Hilfsmethoden des Authentifizierungsmodus zum Konfigurieren eines WCF SecurityBindingElement nutzen können.

Wenn kein WCF-Authentifizierungsmodus vorhanden ist, der einer benutzerdefinierten Richtlinienassertion entspricht, die SOAP-Nachrichten sichert, leiten Sie eine Klasse aus den TransportSecurityBindingElement-, SymmetricSecurityBindingElement- oder AsymmetricSecurityBindingElement WCF-Klassen ab, und legen Sie das entsprechende Bindungselement fest. Weitere Informationen finden Sie unter Gewusst wie: Erstellen einer benutzerdefinierten Bindung mit dem SecurityBindingElement.

Informationen zum Umwandeln einer benutzerdefinierten Richtlinienassertion, die keine SOAP-Nachricht sichert, finden Sie unter Filtern und im Beispiel Custom Message Interceptor.

Benutzerdefiniertes WSE 3.0 Sicherheitstoken

Das WCF-Programmiermodell zur Erstellung eines benutzerdefinierten Tokens unterscheidet sich von WSE 3.0. Einzelheiten über das Erstellen eines benutzerdefinierten Tokens in WSE finden Sie unter Erstellen benutzerdefinierter Sicherheitstoken (möglicherweise in englischer Sprache). Ausführliche Informationen über das Erstellen eines benutzerdefinierten Tokens in WCF finden Sie unter Gewusst wie: Erstellen eines benutzerdefinierten Tokens.

Benutzerdefinierter WSE 3.0 Token-Manager

Das Programmiermodell zur Erstellung eines benutzerdefinierten Token-Managers unterscheidet sich in WCF von WSE 3.0. Einzelheiten über das Erstellen eines benutzerdefinierten Token-Managers und die anderen Komponenten, die für ein benutzerdefiniertes Sicherheitstoken erforderlich sind, finden Sie unter Gewusst wie: Erstellen eines benutzerdefinierten Tokens.

Tipp

Wenn Sie einen benutzerdefinierten UsernameToken-Sicherheitstoken-Manager erstellt haben, stellt WCF einen einfacheren Mechanismus zur Verfügung, um die Authentifizierungslogik festzulegen, als das Erstellen eines benutzerdefinierten Sicherheitstoken-Managers. Weitere Informationen finden Sie unter Gewusst wie: Verwenden eines benutzerdefinierten Benutzernamens und eines Kennwort-Validierungssteuerelements.

WSE 3.0-Webdienste, die MTOM-codierte SOAP-Nachrichten verwenden

Wie eine WSE 3-Anwendung kann eine WCF-Anwendung die MTOM-Nachrichtencodierung in der Konfiguration festlegen. Um diese Einstellung zu migrieren, fügen Sie der Bindung für den Dienst das mtomMessageEncoding element hinzu. Im folgenden Codebeispiel wird veranschaulicht, wie eine MTOM-Codierung in WSE 3.0 für einen Dienst festgelegt wird, der WCF entspricht.

WSE 3.0

<messaging>
    <mtom clientMode="On"/>
</messaging>

WCF

<customBinding>
  <binding name="MyBinding">
    <mtomMessageEncoding/>
  </binding>
</customBinding>

Messaging

WSE 3.0-Anwendungen, die die WSE-Messaging-API verwenden

Wenn die WSE-Messaging-API verwendet wird, um direkten Zugriff auf die XML zu erhalten, die zwischen dem Client und dem Webdienst kommuniziert wird, kann die Anwendung so umgewandelt werden, dass sie "Plain Old XML" (POX) verwendet. Weitere Einzelheiten über POX finden Sie unter Interoperabilität mit POX-Anwendungen. Weitere Einzelheiten über die WSE-Messaging-API finden Sie unter Senden und Empfangen von SOAP-Nachrichten mit der WSE-Messaging-API (möglicherweise in englischer Sprache).

Transporte

TCP

Standardmäßig interoperieren WSE 3.0-Clients und -Webdienste, die SOAP-Nachrichten mittels TCP-Transport senden, nicht mit WCF-Clients und -Webdiensten. Diese Inkompatibilität beruht auf Unterschieden in dem im TCP-Protokoll verwendeten Rahmen und auf Leistungsgründen. Ein WCF-Beispiel listet jedoch auf, wie eine benutzerdefinierte TCP-Sitzung, die mit WSE 3.0 interoperiert, implementiert wird. Einzelheiten zu diesem Beispiel finden Sie unter Transport: WSE 3.0 TCP Interoperability.

Um festzulegen, dass eine WCF-Anwendung den TCP-Transport verwendet, verwenden Sie das netTcpBinding Element.

Benutzerdefinierter Transport

Die Entsprechung eines benutzerdefinierten WSE 3.0-Transports in WCF ist eine Kanalerweiterung. Ausführliche Informationen zum Erstellen einer Kanalerweiterung finden Sie unter Erweitern der Kanalschicht.

Siehe auch

Aufgaben

Gewusst wie: Erstellen eines SecurityBindingElement für einen angegebenen Authentifizierungsmodus

Konzepte

Grundlegender Programmierlebenszyklus
Benutzerdefinierte Bindungen
Gewusst wie: Erstellen einer benutzerdefinierten Bindung mit dem SecurityBindingElement