Migrieren von WSE 3.0-Webdiensten zu WCF

Die Vorteile der Migration 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. Für einen Webdienst kann durch die Migration von WSE 3.0 zu WCF eine Leistungsverbesserung von bis zu 200 % bis 400 % erzielt werden. Weitere Informationen zu den von WCF unterstützten Transporten finden Sie unter Auswählen eines Transports. Eine Liste der von WCF unterstützten Szenarien finden Sie unter Allgemeine Sicherheitsszenarien. Eine Liste der Spezifikationen, die von WCF unterstützt werden, finden Sie im Leitfaden 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 Netzwerkebene und eine gemeinsame Terminologie. WSE 3.0 und WCF-Anwendungen arbeiten auf Netzwerkebene zusammen, basierend auf einem Satz von WS-*-Spezifikationen, den beide unterstützen. Wenn eine WSE 3.0- oder WCF-Anwendung entwickelt wird, gibt es eine gemeinsame Terminologie, wie die Namen von sofort verwendbaren Sicherheitsassertionen in WSE und die Authentifizierungsmodi.

Es gibt viele ähnliche Aspekte zwischen den Programmiermodellen von WCF und ASP.NET oder WSE 3.0, aber auch Unterschiede. Ausführliche Informationen zum WCF-Programmiermodell finden Sie unter Grundlegender Programmierlebenszyklus.

Hinweis

Um einen WSE-Webdienst zu WCF zu migrieren, kann das ServiceModel Metadata Utility-Tool (Svcutil.exe) zum Generieren eines Clients verwendet werden. 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. Den Fehler finden Sie in der inneren Ausnahme. 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 einen Dienst mithilfe einer Konfigurationsdatei 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. Die sofort verwendbaren Sicherheitsassertionen entsprechen weitestgehend dem Authentifizierungsmodus eines WCF-Sicherheitsbindungselements. Die WCF-Authentifizierungsmodi und die sofort verwendbaren WSE 3.0-Sicherheitsassertionen sind nicht nur gleich oder ähnlich benannt, sie schützen auch die Nachrichten unter Verwendung derselben Anmeldeinformationstypen. So entspricht z. B. die sofort verwendbare Sicherheitsassertion usernameForCertificate in WSE 3.0 dem Authentifizierungsmodus UsernameForCertificate in WCF. Die folgenden Codebeispiele zeigen, inwiefern eine minimale Richtlinie, die die sofort verwendbare Sicherheitsassertion usernameForCertificate in WSE 3.0 verwendet, einem Authentifizierungsmodus UsernameForCertificate in WCF in einer benutzerdefinierten Bindung entspricht.

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 in einer Richtliniendatei festgelegten Sicherheitseinstellungen eines WSE 3.0-Webdiensts zu WCF zu migrieren, muss eine benutzerdefinierte Bindung in einer Konfigurationsdatei erstellt und die sofort verwendbare 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 beibehalten 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: Schützen eines Webdiensts ohne Verwendung einer Richtliniendatei. Um bei WCF Sicherheitsanforderungen im Code festzulegen, erstellen Sie eine Instanz der BindingElementCollection-Klasse, und fügen Sie der BindingElementCollection eine SecurityBindingElement-Instanz hinzu. Die Anforderungen an die Sicherheitsassertionen werden mit den statischen Hilfsmethoden des Authentifizierungsmodus der SecurityBindingElement-Klasse festgelegt. Weitere Informationen zum Angeben von Sicherheitsanforderungen im Code mithilfe von WCF finden Sie unter Gewusst wie: Erstellen einer benutzerdefinierten Bindung mit dem SecurityBindingElement und unter 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 schützen, werden von der WSE 3.0-SecurityPolicyAssertion-Klasse abgeleitet. Das konzeptuelle Äquivalent in WCF ist die SecurityBindingElement-Klasse.

Beachten Sie unbedingt, dass die sofort verwendbaren WSE 3.0-Sicherheitsassertionen eine Teilmenge der WCF-Authentifizierungsmodi sind. Wenn Sie in WSE 3.0 eine benutzerdefinierte Richtlinienassertion erstellt haben, gibt es möglicherweise einen entsprechenden WCF-Authentifizierungsmodus. 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 definiert haben, ist die Migration mit WCF ganz einfach. WCF definiert einen Authentifizierungsmodus für dieses Szenario, sodass Sie die statischen Hilfsmethoden des Authentifizierungsmodus zum Konfigurieren eines WCFSecurityBindingElement verwenden können.

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

Informationen zum Konvertieren einer benutzerdefinierten Richtlinienassertion, die keine SOAP-Nachricht schützt, finden Sie unter Filterung und im Beispiel Benutzerdefinierter Nachrichteninterceptor.

Benutzerdefiniertes WSE 3.0 Sicherheitstoken

Das WCF-Programmiermodell zum Erstellen eines benutzerdefinierten Tokens unterscheidet sich von dem in WSE 3.0. Ausführliche Informationen zum Erstellen eines benutzerdefinierten Tokens in WSE finden Sie unter Erstellen benutzerdefinierter Sicherheitstoken. Ausführliche Informationen zum Erstellen eines benutzerdefinierten Tokens in WCF finden Sie unter Gewusst wie: Erstellen eines benutzerdefinierten Tokens.

Benutzerdefinierter WSE 3.0 Token-Manager

Das Programmiermodell zum Erstellen eines benutzerdefinierten Token-Managers in WCF unterscheidet sich von dem in WSE 3.0. Ausführliche Informationen zum Erstellen eines benutzerdefinierten Token-Managers und der anderen Komponenten, die für ein benutzerdefiniertes Sicherheitstoken erforderlich sind, finden Sie unter Gewusst wie: Erstellen eines benutzerdefinierten Tokens.

Hinweis

Wenn Sie einen benutzerdefinierten UsernameToken-Sicherheitstoken-Manager erstellt haben, stellt WCF einen einfacheren Mechanismus zum Angeben der Authentifizierungslogik zur Verfügung als das Erstellen eines benutzerdefinierten Sicherheitstoken-Managers. Weitere Informationen finden Sie unter Gewusst wie: Verwenden eines benutzerdefinierten Validierungssteuerelements für Benutzernamen und Kennwörter.

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 <mtomMessageEncoding> hinzu. Im folgenden Codebeispiel wird veranschaulicht, wie eine MTOM-Codierung in WSE 3.0 für einen entsprechenden Dienst in WCF festgelegt wird.

WSE 3.0

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

WCF

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

Nachrichten

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 Informationen zu POX finden Sie unter Interoperabilität mit POX-Anwendungen. Weitere Einzelheiten zur WSE-Messaging-API finden Sie unter Senden und Empfangen von SOAP-Nachrichten mit der WSE-Messaging-API.

Transportprotokolle

TCP

Standardmäßig gibt es keine Zusammenarbeit zwischen WSE 3.0-Clients und -Webdiensten, die SOAP-Nachrichten mittels TCP-Transport senden, und WCF-Clients und -Webdiensten. Diese Inkompatibilität beruht auf Unterschieden in dem im TCP-Protokoll verwendeten Rahmen und auf Leistungsgründen. Ein WCF-Beispiel veranschaulicht jedoch, wie eine benutzerdefinierte TCP-Sitzung implementiert wird, die mit WSE 3.0 zusammenarbeitet. Ausführliche Informationen zu diesem Beispiel finden Sie unter Transport: WSE 3.0-TCP-Interoperabilität.

Um festzulegen, dass eine WCF-Anwendung den TCP-Transport nutzt, verwenden Sie <netTcpBinding>.

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 Kanalebene.

Siehe auch