DienstversionsverwaltungService Versioning

Nach der ursprünglichen Bereitstellung und möglicherweise mehreren Bereitstellungen während ihrer Lebensdauer müssen die Dienste (und die Endpunkte, die sie verfügbar machen) eventuell geändert werden. Dafür kann es verschiedene Gründe geben, z. B. veränderte Geschäftsanforderungen, Anforderungen an die Informationstechnologie oder andere Themen, die in die Dienste integriert werden müssen.After initial deployment, and potentially several times during their lifetime, services (and the endpoints they expose) may need to be changed for a variety of reasons, such as changing business needs, information technology requirements, or to address other issues. Jede Änderung führt zu einer neuen Version des Diensts.Each change introduces a new version of the service. In diesem Thema wird erläutert, Überlegungen zur versionsverwaltung in Windows Communication Foundation (WCF).This topic explains how to consider versioning in Windows Communication Foundation (WCF).

Vier Kategorien von DienständerungenFour Categories of Service Changes

Die Änderungen von Diensten, die eventuell erforderlich sind, können in vier Kategorien unterteilt werden:The changes to services that may be required can be classified into four categories:

  • Vertragsänderungen: Ein Vorgang wird z. B. hinzugefügt, oder ein Datenelement in einer Nachricht wird hinzugefügt oder geändert.Contract changes: For example, an operation might be added, or a data element in a message might be added or changed.

  • Adressänderungen: Ein Dienst wird z. B. an einen anderen Speicherort verschoben, an dem die Endpunkte neue Adressen aufweisen.Address changes: For example, a service moves to a different location where endpoints have new addresses.

  • Bindungsänderungen: Ein Sicherheitsmechanismus oder seine Einstellungen werden z. B. geändert.Binding changes: For example, a security mechanism changes or its settings change.

  • Implementierungsänderungen: Wenn sich z. B. eine interne Methodenimplementierung ändert.Implementation changes: For example, when an internal method implementation changes.

Einige dieser Änderungen werden als "unterbrechend" und andere als "nicht unterbrechend" bezeichnet.Some of these changes are called "breaking" and others are "nonbreaking." Eine Änderung ist geschütztes , wenn alle Nachrichten, die erfolgreich in der vorherigen Version verarbeitet worden wären, in der neuen Version erfolgreich verarbeitet werden.A change is nonbreaking if all messages that would have been processed successfully in the previous version are processed successfully in the new version. Jede Änderung, die dieses Kriterium nicht erfüllt ist ein wichtige ändern.Any change that does not meet that criterion is a breaking change.

Dienstausrichtung und VersionsverwaltungService Orientation and Versioning

Einer der Grundsätze der Dienstausrichtung ist, dass die Dienste und Clients autonom (oder unabhängig) sind.One of the tenets of service orientation is that services and clients are autonomous (or independent). Unter anderem impliziert dies, dass die Dienstentwickler nicht davon ausgehen können, dass sie alle Dienstclients steuern oder sogar kennen.Among other things, this implies that service developers cannot assume that they control or even know about all service clients. Dies beeinträchtigt die Möglichkeit, alle Clients neu zu erstellen und neu bereitzustellen, wenn die Version eines Diensts geändert wird.This eliminates the option of rebuilding and redeploying all clients when a service changes versions. In diesem Thema wird davon ausgegangen, dass der Dienst diesem Grundsatz folgt und daher unabhängig von den Clients geändert oder "versionsverwaltet" werden muss.This topic assumes the service adheres to this tenet and therefore must be changed or "versioned" independent of its clients.

In den Fällen, in denen keine unterbrechende Änderung erwartet wird und diese nicht verhindert werden kann, kann dieser Grundsatz von einer Anwendung ignoriert werden. Dadurch wird es dann erforderlich, dass die Clients neu erstellt und mit einer neueren Version des Diensts bereitgestellt werden.In cases where a breaking change is unexpected and cannot be avoided, an application may choose to ignore this tenet and require that clients be rebuilt and redeployed with a new version of the service.

VertragsversionsverwaltungContract Versioning

Von einem Client verwendete Verträge müssen nicht dem Vertrag entsprechen, der vom Dienst verwendet wird. Sie müssen lediglich kompatibel sein.Contracts used by a client do not need to be the same as the contract used by the service; they need only to be compatible.

Für Dienstverträge bedeutet Kompatibilität, dass neue, vom Dienst verfügbar gemachte Vorgänge hinzugefügt, vorhandene Vorgänge jedoch nicht entfernt oder semantisch geändert werden können.For service contracts, compatibility means new operations exposed by the service can be added but existing operations cannot be removed or changed semantically.

Für Datenverträge bedeutet Kompatibilität, dass neue Schematypdefinitionen hinzugefügt, vorhandene Schematypdefinitionen jedoch nicht auf die unterbrechende Art geändert werden können.For data contracts, compatibility means new schema type definitions can be added but existing schema type definitions cannot be changed in breaking ways. Zu den unterbrechenden Änderungen können das Entfernen von Datenmembern oder das Ändern ihrer Datentypinkompatibilität gehören.Breaking changes might include removing data members or changing their data type incompatibly. Diese Funktion bietet dem Dienst einigen Spielraum zum Ändern seiner Vertragsversionen, ohne Clients zu unterbrechen.This feature allows the service some latitude in changing the version of its contracts without breaking clients. In den nächsten beiden Abschnitten wird erläutert, geschützte und wichtige Änderungen, die mit WCF-Daten hergestellt werden können und-Dienstverträgen.The next two sections explain nonbreaking and breaking changes that can be made to WCF data and service contracts.

DatenvertragsversionsverwaltungData Contract Versioning

In diesem Abschnitt wird die Datenversionsverwaltung für die DataContractSerializer-Klasse und die DataContractAttribute-Klasse beschrieben.This section deals with data versioning when using the DataContractSerializer and DataContractAttribute classes.

Strenge VersionsverwaltungStrict Versioning

In vielen Szenarien, in denen das Ändern der Versionen ein Problem darstellt, hat der Dienstentwickler keine Kontrolle über die Clients und kann deshalb keine Annahmen darüber abgeben, wie sie auf Änderungen in der Nachrichten-XML oder im Schema reagieren würden.In many scenarios when changing versions is an issue, the service developer does not have control over the clients and therefore cannot make assumptions about how they would react to changes in the message XML or schema. In diesen Fällen müssen Sie sicherstellen, dass die neuen Nachrichten aus zwei Gründen anhand des alten Schemas überprüft werden:In these cases, you must guarantee that the new messages will validate against the old schema, for two reasons:

  • Die alten Clients wurden mit der Annahme entwickelt, dass sich das Schema nicht ändert.The old clients were developed with the assumption that the schema will not change. Sie können eventuell keine Nachrichten verarbeiten, für die sie nicht vorgesehen waren.They may fail to process messages that they were never designed for.

  • Die alten Clients können eventuell anhand des alten Schemas eine tatsächliche Schemavalidierung durchführen, bevor sie versuchen, die Nachrichten zu verarbeiten.The old clients may perform actual schema validation against the old schema before even attempting to process the messages.

Die empfohlene Methode in solchen Szenarien besteht darin, vorhandene Datenverträge als unveränderlich zu behandeln und neue Verträge mit eindeutigen qualifizierten XML-Namen zu erstellen.The recommended approach in such scenarios is to treat existing data contracts as immutable and create new ones with unique XML qualified names. Der Dienstentwickler würde dann entweder einem bereits vorhandenen Dienstvertrag neue Methoden hinzufügen oder einen neuen Dienstvertrag mit Methoden erstellen, die den neuen Datenvertrag verwenden.The service developer would then either add new methods to an existing service contract or create a new service contract with methods that use the new data contract.

Es wird häufig der Fall sein, dass ein Dienstentwickler einen Teil der Geschäftslogik schreiben muss, der in allen Versionen eines Datenvertrags ausgeführt werden sollte, sowie zusätzlich versionsspezifischen Geschäftscode für jede Version des Datenvertrags.It will often be the case that a service developer needs to write some business logic that should run within all versions of a data contract plus version-specific business code for each version of the data contract. Im Anhang am Ende dieses Themas wird erläutert, wie die Schnittstellen verwendet werden können, um diese Anforderung zu erfüllen.The appendix at the end of this topic explains how interfaces can be used to satisfy this need.

Weniger strenge VersionsverwaltungLax Versioning

In vielen anderen Szenarien kann der Dienstentwickler davon ausgehen, dass das Hinzufügen eines neuen, optionalen Members zum Datenvertrag keine vorhandenen Clients unterbricht.In many other scenarios, the service developer can make the assumption that adding a new, optional member to the data contract will not break existing clients. Dazu muss der Dienstentwickler überprüfen, ob die vorhandenen Clients keine Schemavalidierung durchführen und dass sie unbekannte Datenmember ignorieren.This requires the service developer to investigate whether existing clients are not performing schema validation and that they ignore unknown data members. In diesen Szenarien ist es möglich, die Datenvertragsfunktionen zum Hinzufügen neuer Member auf eine nicht unterbrechende Weise zu nutzen.In these scenarios, it is possible to take advantage of data contract features for adding new members in a nonbreaking way. Der Dienstentwickler kann diese Annahme machen, wenn die Datenvertragsfunktionen für die Versionsverwaltung bereits für die erste Version des Diensts verwendet wurden.The service developer can make this assumption with confidence if the data contract features for versioning were already used for the first version of the service.

WCF, ASP.NET-Webdienste und viele andere Web-service-Webdienststapel unterstützen weniger strenge versionsverwaltung: d. h., sie nicht lösen Sie Ausnahmen für neue unbekannte Datenmember in den empfangenen Daten.WCF, ASP.NET Web Services, and many other Web service stacks support lax versioning: that is, they do not throw exceptions for new unknown data members in received data.

Häufig wird fälschlicherweise angenommen, dass die vorhandenen Clients durch das Hinzufügen eines neuen Members nicht unterbrochen werden können.It is easy to mistakenly believe that adding a new member will not break existing clients. Falls Sie sich nicht sicher sind, ob alle Clients für die weniger strenge Versionsverwaltung ausgerichtet sind, wird empfohlen, die strengen Richtlinien zur Versionsverwaltung zu verwenden und die Datenverträge als unveränderlich zu behandeln.If you are unsure that all clients can handle lax versioning, the recommendation is to use the strict versioning guidelines and treat data contracts as immutable.

Detaillierte Richtlinien für die lax und strenge versionsverwaltung von Datenverträgen finden Sie unter Vorgehensweisen: versionsverwaltung von Datenverträgen.For detailed guidelines for both lax and strict versioning of data contracts, see Best Practices: Data Contract Versioning.

Unterscheidung zwischen Datenvertrags- und .NET-TypenDistinguishing Between Data Contract and .NET Types

Eine .NET-Klasse oder eine Struktur kann als Datenvertrag projiziert werden, indem Sie der Klasse das DataContractAttribute-Attribut hinzufügen.A .NET class or structure can be projected as a data contract by applying the DataContractAttribute attribute to the class. Der .NET-Typ und seine Datenvertragsprojektionen sind zwei verschiedene Dinge.The .NET type and its data contract projections are two distinct matters. Es können mehrere .NET-Typen mit derselben Datenvertragsprojektion vorhanden sein.It is possible to have multiple .NET types with the same data contract projection. Diese Unterscheidung ist besonders nützlich, wenn Sie den .NET-Typ ändern und gleichzeitig den projizierten Datenvertrag beibehalten möchten, wobei Sie gleichzeitig die Kompatibilität mit den bereits vorhandenen Clients bewahren.This distinction is especially useful in allowing you to change the .NET type while maintaining the projected data contract, thereby maintaining compatibility with existing clients even in the strict sense of the word. Sie sollten immer die folgenden beiden Maßnahmen ergreifen, um diese Unterscheidung zwischen .NET-Typ und Datenvertrag beizubehalten:There are two things you should always do to maintain this distinction between .NET type and data contract:

  • Geben Sie einen Name und einen Namespace an.Specify a Name and Namespace. Sie sollten immer den Namen und den Namespace Ihres Datenvertrags angeben, um zu verhindern, dass der Name und der Namespace Ihres .NET-Typs im Vertrag verfügbar gemacht wird.You should always specify the name and namespace of your data contract to prevent your .NET type’s name and namespace from being exposed in the contract. Auf diese Weise bleibt der Datenvertrag derselbe, wenn Sie den .NET-Namespace oder -Typnamen zu einem späteren Zeitpunkt ändern möchten.This way, if you decide later to change the .NET namespace or type name, your data contract remains the same.

  • Geben Sie Name an.Specify Name. Sie sollten immer den Namen Ihrer Datenmember angeben, um zu verhindern, dass der Name des .NET-Members im Vertrag verfügbar gemacht wird.You should always specify the name of your data members to prevent your .NET member name from being exposed in the contract. Auf diese Weise bleibt der Datenvertrag derselbe, wenn Sie den .NET-Namen des Members zu einem späteren Zeitpunkt ändern möchten.This way, if you decide later to change the .NET name of the member, your data contract remains the same.

Ändern oder Entfernen von MembernChanging or Removing Members

Wenn Sie den Namen oder Datentyp eines Members ändern oder Datenmember entfernen, ist dies eine unterbrechende Änderung, auch wenn die weniger strenge Versionsverwaltung zulässig ist.Changing the name or data type of a member, or removing data members is a breaking change even if lax versioning is allowed. Falls dies erforderlich ist, müssen Sie einen neuen Datenvertrag erstellen.If this is necessary, create a new data contract.

Falls die Dienstkompatibilität von hoher Wichtigkeit ist, sollten Sie die nicht verwendeten Datenmember in Ihrem Code ignorieren und sie unverändert lassen.If service compatibility is of high importance, you might consider ignoring unused data members in your code and leave them in place. Falls Sie einen Datenmember in mehrere Member aufteilen, sollten Sie erwägen, den vorhandenen Member als eine Eigenschaft unverändert zu lassen, mit der die erforderliche Aufteilung und erneute Aggregation für Clients auf niedrigeren Ebenen (Clients ohne Upgrade auf die neueste Version) durchgeführt werden.If you are splitting up a data member into multiple members, you might consider leaving the existing member in place as a property that can perform the required splitting and re-aggregation for down-level clients (clients that are not upgraded to the latest version).

Ähnlich verhält es sich mit Änderungen des Namens oder Namespace eines Datenvertrags, bei denen es sich ebenfalls um unterbrechende Änderungen handelt.Similarly, changes to the data contract’s name or namespace are breaking changes.

Round-Trips von unbekannten DatenRound-Trips of Unknown Data

In einigen Szenarien muss ein "Round-Trip" von unbekannten Daten stattfinden, die aus Membern stammen, die einer neuen Version hinzugefügt wurden.In some scenarios, there is a need to "round-trip" unknown data that comes from members added in a new version. So sendet z. B. ein "versionNew"-Dienst Daten mit einigen neu hinzugefügten Membern an einen "versionOld"-Client.For example, a "versionNew" service sends data with some newly added members to a "versionOld" client. Der Client ignoriert die neu hinzugefügten Member beim Verarbeiten der Nachricht, sendet dann jedoch diese Daten, einschließlich der neu hinzugefügten Member, erneut zurück an den versionNew-Dienst.The client ignores the newly added members when processing the message, but it resends that same data, including the newly added members, back to the versionNew service. Das typische Szenario dafür sind Datenupdates, bei denen Daten aus dem Dienst entfernt, geändert und zurückgegeben werden.The typical scenario for this is data updates where data is retrieved from the service, changed, and returned.

Um die Roundtrip-Funktion für einen bestimmten Typ zu aktivieren, muss der Typ die IExtensibleDataObject-Schnittstelle implementieren.To enable round-tripping for a particular type, the type must implement the IExtensibleDataObject interface. Die Schnittstelle enthält die ExtensionData-Eigenschaft, die den ExtensionDataObject-Typ zurückgibt.The interface contains one property, ExtensionData that returns the ExtensionDataObject type. In der Eigenschaft werden alle Daten aus zukünftigen Versionen des Datenvertrags gespeichert, der in der aktuellen Version unbekannt ist.The property is used to store any data from future versions of the data contract that is unknown to the current version. Diese Daten sind für den Client nicht transparent. Wenn jedoch die Instanz serialisiert wird, wird der Inhalt der ExtensionData-Eigenschaft mit den restlichen Daten der Datenvertragsmember geschrieben.This data is opaque to the client, but when the instance is serialized, the content of the ExtensionData property is written with the rest of the data contract members' data.

Es wird empfohlen, dass alle Typen diese Schnittstelle implementieren, um neue und unbekannte zukünftige Member aufzunehmen.It is recommended that all your types implement this interface to accommodate new and unknown future members.

DatenvertragsbibliothekenData Contract Libraries

Es können Bibliotheken mit Datenverträgen vorhanden sein, für die ein Vertrag in einem zentralen Repository veröffentlicht wird. Die Dienst- und Typimplementierer implementieren Datenverträge aus diesem Repository und machen diese so verfügbar.There may be libraries of data contracts where a contract is published to a central repository, and service and type implementers implement and expose data contracts from that repository. In diesem Fall können Sie beim Veröffentlichen eines Datenvertrags im Repository nicht steuern, wer Typen erstellt, die ihn implementieren.In that case, when you publish a data contract to the repository, you have no control over who creates types that implement it. Sie können also den Vertrag nicht ändern, wenn er erst einmal veröffentlicht wurde, da er dadurch unveränderlich geworden ist.Thus, you cannot modify the contract once it is published, rendering it effectively immutable.

Verwenden des XmlSerializerWhen Using the XmlSerializer

Dieselben Versionsverwaltungsgrundlagen gelten, wenn Sie die XmlSerializer-Klasse verwenden.The same versioning principles apply when using the XmlSerializer class. Wenn die strenge Versionsverwaltung erforderlich ist, sollten Sie die Datenverträge als unveränderlich behandeln und neue Datenverträge mit eindeutigen, qualifizierten Namen für die neuen Versionen erstellen.When strict versioning is required, treat data contracts as immutable and create new data contracts with unique, qualified names for the new versions. Wenn Sie sicher sind, dass die weniger strenge Versionsverwaltung verwendet werden kann, können Sie neue serialisierbare Member in neuen Versionen hinzufügen, bereits vorhandene Member jedoch nicht ändern oder entfernen.When you are sure that lax versioning can be used, you can add new serializable members in new versions but not change or remove existing members.

Hinweis

Der XmlSerializer verwendet das XmlAnyElementAttribute-Attribut und das XmlAnyAttributeAttribute-Attribut, um Round-Trips von unbekannten Daten zu unterstützen.The XmlSerializer uses the XmlAnyElementAttribute and XmlAnyAttributeAttribute attributes to support round-tripping of unknown data.

Versionsverwaltung für NachrichtenverträgeMessage Contract Versioning

Die Richtlinien für die Versionsverwaltung von Nachrichtenverträgen sind ähnlich wie diejenigen für die Versionsverwaltung von Datenverträgen.The guidelines for message contract versioning are very similar to versioning data contracts. Falls eine strenge Versionsverwaltung erforderlich ist, sollten Sie den Nachrichtentext nicht ändern, sondern stattdessen einen neuen Nachrichtenvertrag mit einem eindeutig qualifizierten Namen erstellen.If strict versioning is required, you should not change your message body but instead create a new message contract with a unique qualified name. Wenn Sie sicher sind, dass Sie die weniger strenge Versionsverwaltung verwenden können, können Sie neue Teile des Nachrichtentexts hinzufügen, die bereits vorhandenen jedoch nicht ändern oder entfernen.If you know that you can use lax versioning, you can add new message body parts but not change or remove existing ones. Diese Richtlinie gilt sowohl für reine als auch für eingeschlossene Nachrichtenverträge.This guidance applies both to bare and wrapped message contracts.

Nachrichtenheader können immer hinzugefügt werden, auch wenn die strenge Versionsverwaltung verwendet wird.Message headers can always be added, even if strict versioning is in use. Das MustUnderstand-Flag kann sich auf die Versionsverwaltung auswirken.The MustUnderstand flag may affect versioning. Im Allgemeinen ist das Modell der versionsverwaltung für Header in WCF, wie in der SOAP-Spezifikation beschrieben.In general, the versioning model for headers in WCF is as described in the SOAP specification.

Versionsverwaltung für DienstverträgeService Contract Versioning

Ähnlich wie bei der Versionsverwaltung für Datenverträge umfasst die Versionsverwaltung für Dienstverträge auch das Hinzufügen, Ändern und Entfernen von Vorgängen.Similar to data contract versioning, service contract versioning also involves adding, changing, and removing operations.

Angeben von Name, Namespace und AktionSpecifying Name, Namespace, and Action

Standardmäßig entspricht der Name eines Dienstvertrags dem Namen der Schnittstelle.By default, the name of a service contract is the name of the interface. Der Standardnamespace ist "http://tempuri.org", und jeder Vorgang Aktion ist "http://tempuri.org/contractname/methodname".Its default namespace is "http://tempuri.org", and each operation’s action is "http://tempuri.org/contractname/methodname". Es wird empfohlen, dass Sie einen Namen und Namespace-URI für den Dienstvertrag und eine Aktion für jeden Vorgang mit vermeiden explizit angeben "http://tempuri.org" und zu verhindern, dass die Schnittstellen- und Methodennamen im Vertrag für den Dienst verfügbar gemacht wird.It is recommended that you explicitly specify a name and namespace for the service contract, and an action for each operation to avoid using "http://tempuri.org" and to prevent interface and method names from being exposed in the service’s contract.

Hinzufügen von Parametern und VorgängenAdding Parameters and Operations

Beim Hinzufügen von Vorgängen, die vom Dienst verfügbar gemacht werden, handelt es sich um eine nicht unterbrechende Änderung, da die vorhandenen Clients diese neuen Vorgänge nicht berücksichtigen müssen.Adding service operations exposed by the service is a nonbreaking change because existing clients need not be concerned about those new operations.

Hinweis

Beim Hinzufügen von Vorgängen zu einem Duplexrückrufvertrag handelt es sich um eine unterbrechende Änderung.Adding operations to a duplex callback contract is a breaking change.

Ändern von Vorgangsparametern oder RückgabetypenChanging Operation Parameter or Return Types

Beim Ändern von Parametern oder Rückgabetypen handelt es sich im Allgemeinen um eine unterbrechende Änderung, solange der neue Typ denselben Datenvertrag implementiert wie dies beim alten Typ der Fall ist.Changing parameter or return types generally is a breaking change unless the new type implements the same data contract implemented by the old type. Um eine solche Änderung durchzuführen, fügen Sie dem Dienstvertrag einen neuen Vorgang hinzu oder definieren einen neuen Dienstvertrag.To make such a change, add a new operation to the service contract or define a new service contract.

Entfernen von VorgängenRemoving Operations

Beim Entfernen von Vorgängen handelt es sich ebenfalls um eine unterbrechende Änderung.Removing operations is also a breaking change. Um eine solche Änderung durchzuführen, definieren Sie einen neuen Dienstvertrag und machen ihn einem neuen Endpunkt verfügbar.To make such a change, define a new service contract and expose it on a new endpoint.

FehlerverträgeFault Contracts

Mit dem FaultContractAttribute-Attribut kann ein Dienstvertragentwickler Informationen über Fehler angeben, die von den Vertragsvorgängen zurückgegeben werden können.The FaultContractAttribute attribute enables a service contract developer to specify information about faults that can be returned from the contract's operations.

Die Liste der in einem Dienstvertrag beschriebenen Fehler wird nicht als vollständig betrachtet.The list of faults described in a service's contract is not considered exhaustive. Ein Vorgang kann jederzeit Fehler zurückgeben, die in seinem Vertrag nicht beschrieben sind.At any time, an operation may return faults that are not described in its contract. Deshalb werden Änderungen der im Vertrag beschriebenen Fehler nicht als unterbrechend betrachtet.Therefore changing the set of faults described in the contract is not considered breaking. Beispielsweise das Hinzufügen eines neuen Fehlers zum Vertrag mithilfe von FaultContractAttribute oder das Entfernen eines vorhandenen Fehlers aus dem Vertrag.For example, adding a new fault to the contract using the FaultContractAttribute or removing an existing fault from the contract.

DienstvertragsbibliothekenService Contract Libraries

In Organisationen können Bibliotheken mit Verträgen vorhanden sein. Dabei wird ein Vertrag in einem zentralen Repository veröffentlicht, und die Dienstimplementierer implementieren Datenverträge aus diesem Repository.Organizations may have libraries of contracts where a contract is published to a central repository and service implementers implement contracts from that repository. In diesem Fall können Sie beim Veröffentlichen eines Dienstvertrags im Repository nicht steuern, wer Dienste erstellt, die ihn implementieren.In this case, when you publish a service contract to the repository you have no control over who creates services that implement it. Sie können daher den Dienstvertrag nicht ändern, nachdem er veröffentlicht wurde, da er dadurch unveränderlich wird.Therefore, you cannot modify the service contract once published, rendering it effectively immutable. WCF unterstützt die vertragsvererbung, die verwendet werden kann, um einen neuen Vertrag zu erstellen, der bereits vorhandener Verträge erweitert.WCF supports contract inheritance, which can be used to create a new contract that extends existing contracts. Wenn Sie diese Funktion verwenden möchten, müssen Sie eine neue Dienstvertragsschnittstelle definieren, die von der alten Dienstvertragsschnittstelle erbt, und dann der neuen Schnittstelle Methoden hinzufügen.To use this feature, define a new service contract interface that inherits from the old service contract interface, then add methods to the new interface. Anschließend ändern Sie den Dienst, der den alten Vertrag implementiert, um den neuen Vertrag zu implementieren, und ändern die "versionOld"-Endpunktdefinition für die Verwendung des neuen Vertrags.You then change the service that implements the old contract to implement the new contract and change the "versionOld" endpoint definition to use the new contract. Für "versionOld"-Clients erscheint der Endpunkt weiterhin als "versionOld"-Vertrag; für "versionNew"-Clients erscheint der Endpunkt als "versionNew"-Vertrag.To "versionOld" clients, the endpoint will continue to appear as exposing the "versionOld" contract; to "versionNew" clients, the endpoint will appear to expose the "versionNew" contract.

Versionsverwaltung von Adressen und BindungenAddress and Binding Versioning

Bei Änderungen an der Endpunktadresse und -bindung handelt es sich um unterbrechende Änderungen, solange die Clients die neue Endpunktadresse oder -bindung nicht dynamisch erkennen können.Changes to endpoint address and binding are breaking changes unless clients are capable of dynamically discovering the new endpoint address or binding. Ein Mechanismus zur Implementierung dieser Funktion ist die Verwendung einer UDDI-Registrierung sowie des UDDI-Aufrufmusters, bei der ein Client versucht, mit einem Endpunkt zu kommunizieren und im Falle eines Scheiterns eine bekannte UDDI-Registrierung für die aktuellen Endpunktdaten abfragt.One mechanism for implementing this capability is by using a Universal Discovery Description and Integration (UDDI) registry and the UDDI Invocation Pattern where a client attempts to communicate with an endpoint and, upon failure, queries a well-known UDDI registry for the current endpoint metadata. Der Client verwendet dann die Adresse und die Bindung aus diesen Metadaten, um mit dem Endpunkt zu kommunizieren.The client then uses the address and binding from this metadata to communicate with the endpoint. Wenn diese Kommunikation erfolgreich ist, speichert der Client die Adress- und Bindungsinformationen für eine spätere Verwendung zwischen.If this communication succeeds, the client caches the address and binding information for future use.

Routingdienst und VersionsverwaltungRouting Service and Versioning

Wenn es sich bei an einem Dienst vorgenommenen Änderungen um unterbrechende Änderungen handelt und Sie zwei oder mehr verschiedene Versionen eines Diensts gleichzeitig ausführen müssen, können Sie mit dem WCF-Routingdienst Meldungen an die entsprechende Dienstinstanz weiterleiten.If the changes made to a service are breaking changes and you need to have two or more different versions of a service running simultaneously you can use the WCF Routing Service to route messages to the appropriate service instance. Der WCF-Routingdienst führt inhaltsbasiertes Routing aus. Mit anderen Worten: Anhand von Informationen innerhalb der Nachricht wird bestimmt, an welches Ziel die Nachricht weitergeleitet wird.The WCF Routing Service uses content-based routing, in other words, it uses information within the message to determine where to route the message. Weitere Informationen finden Sie in der WCF-Routingdienst Routingdienst.For more information about the WCF Routing Service see Routing Service. Ein Beispiel zum Verwenden der WCF-Routingdienst für die dienstversionsverwaltung finden Sie unter How To: Dienstversionsverwaltung.For an example of how to use the WCF Routing Service for service versioning see How To: Service Versioning.

AnhangAppendix

Die allgemeine Richtlinie für die Datenvertrags-Versionsverwaltung im Falle der strengen Versionsverwaltung besagt, dass Datenverträge als unveränderlich behandelt werden und neue Verträge erstellt werden, wenn Änderungen erforderlich sind.The general data contract versioning guidance when strict versioning is needed is to treat data contracts as immutable and create new ones when changes are required. Für jeden neuen Datenvertrag muss eine neue Klasse erstellt werden. Deshalb ist ein Mechanismus erforderlich, mit dem vermieden wird, dass bereits vorhandener Code, der für die alte Datenvertragsklasse geschrieben wurde, für die neue Datenvertragsklasse neu geschrieben werden muss.A new class needs to be created for each new data contract, so a mechanism is needed to avoid having to take existing code that was written in terms of the old data contract class and rewrite it in terms of the new data contract class.

Ein solcher Mechanismus besteht z. B. in der Verwendung der Schnittstellen für die Definition der Member eines Datenvertrags und im Schreiben eines internen Implementierungscodes für die Schnittstellen anstatt der Datenvertragsklassen, mit denen die Schnittstellen implementiert werden.One such mechanism is to use interfaces to define the members of each data contract and write internal implementation code in terms of the interfaces rather than the data contract classes that implement the interfaces. Im folgenden Code für Version 1 eines Diensts werden eine IPurchaseOrderV1-Schnittstelle und eine PurchaseOrderV1-Schnittstelle dargestellt:The following code for version 1 of a service shows an IPurchaseOrderV1 interface and a PurchaseOrderV1:

public interface IPurchaseOrderV1  
{  
    string OrderId { get; set; }  
    string CustomerId { get; set; }  
}  

[DataContract(  
Name = "PurchaseOrder",  
Namespace = "http://examples.microsoft.com/WCF/2005/10/PurchaseOrder")]  
public class PurchaseOrderV1 : IPurchaseOrderV1  
{  
    [DataMember(...)]  
    public string OrderId {...}  
    [DataMember(...)]  
    public string CustomerId {...}  
}  

Während die Vorgänge des Dienstvertrags im Sinne von PurchaseOrderV1 geschrieben werden würden, würde die tatsächliche Geschäftslogik IPurchaseOrderV1 entsprechen.While the service contract’s operations would be written in terms of PurchaseOrderV1, the actual business logic would be in terms of IPurchaseOrderV1. In Version 2 würde es dann eine neue IPurchaseOrderV2-Schnittstelle und eine neue PurchaseOrderV2-Klasse geben, wie im folgenden Code dargestellt:Then, in version 2, there would be a new IPurchaseOrderV2 interface and a new PurchaseOrderV2 class as shown in the following code:

public interface IPurchaseOrderV2  
{  
    DateTime OrderDate { get; set; }  
}

[DataContract(   
Name = "PurchaseOrder",  
Namespace = "http://examples.microsoft.com/WCF/2006/02/PurchaseOrder")]  
public class PurchaseOrderV2 : IPurchaseOrderV1, IPurchaseOrderV2  
{  
    [DataMember(...)]  
    public string OrderId {...}  
    [DataMember(...)]  
    public string CustomerId {...}  
    [DataMember(...)]  
    public DateTime OrderDate { ... }  
}  

Der Dienstvertrag würde aktualisiert werden, um neue Vorgänge für PurchaseOrderV2 zu berücksichtigen.The service contract would be updated to include new operations that are written in terms of PurchaseOrderV2. Die vorhandene Geschäftslogik für IPurchaseOrderV1 würde weiterhin für PurchaseOrderV2 funktionieren. Es würde eine neue Geschäftslogik für OrderDate geschrieben, die die IPurchaseOrderV2-Eigenschaft benötigt.Existing business logic written in terms of IPurchaseOrderV1 would continue to work for PurchaseOrderV2 and new business logic that needs the OrderDate property would be written in terms of IPurchaseOrderV2.

Siehe auchSee Also

DataContractSerializer
DataContractAttribute
Name
Namespace
Order
IsRequired
IExtensibleDataObject
ExtensionDataObject
ExtensionData
XmlSerializer
DatenvertragsäquivalenzData Contract Equivalence
Versionstolerante SerialisierungsrückrufeVersion-Tolerant Serialization Callbacks