Entwerfen von DienstverträgenDesigning Service Contracts

In diesem Thema wird erläutert, was Dienstverträge sind, wie sie definiert werden, welche Vorgänge verfügbar sind (und die Implikationen des zugrunde liegenden Meldungsaustauschs), welche Datentypen verwendet werden sowie andere Aspekte, die Sie beim Entwerfen von Vorgängen unterstützen, die den Anforderungen Ihres Szenarios gerecht werden.This topic describes what service contracts are, how they are defined, what operations are available (and the implications for the underlying message exchanges), what data types are used, and other issues that help you design operations that satisfy the requirements of your scenario.

Erstellen eines DienstvertragsCreating a Service Contract

Dienste machen eine Reihe von Vorgängen verfügbar.Services expose a number of operations. Definieren Sie in Windows Communication Foundation (WCF)-Anwendungen, die Vorgänge, indem Sie eine Methode erstellen, und markieren es mit der OperationContractAttribute Attribut.In Windows Communication Foundation (WCF) applications, define the operations by creating a method and marking it with the OperationContractAttribute attribute. Zum Erstellen eines Dienstvertrags gruppieren Sie dann die Vorgänge, indem Sie sie in einer Schnittstelle deklarieren, die mit dem ServiceContractAttribute-Attribut markiert wurde, oder indem Sie sie in einer Klasse definieren, die mit dem gleichen Attribut markiert wurde.Then, to create a service contract, group together your operations, either by declaring them within an interface marked with the ServiceContractAttribute attribute, or by defining them in a class marked with the same attribute. (Ein einfaches Beispiel finden Sie unter wie: Definieren eines Dienstvertrags.)(For a basic example, see How to: Define a Service Contract.)

Alle Methoden, die kein OperationContractAttribute Attribut sind keine Dienstvorgänge und nicht von WCF-Dienste verfügbar gemacht werden.Any methods that do not have a OperationContractAttribute attribute are not service operations and are not exposed by WCF services.

In diesem Thema werden die folgenden Entscheidungspunkte beschrieben, wenn ein Dienstvertrag entworfen wird:This topic describes the following decision points when designing a service contract:

  • Ob Klassen oder Schnittstellen verwendet werden sollenWhether to use classes or interfaces.

  • Wie die Datentypen angegeben werden, die Sie austauschen möchtenHow to specify the data types you want to exchange.

  • Die Typen von Austauschmustern, die Sie verwenden könnenThe types of exchange patterns you can use.

  • Ob Sie einen expliziten Sicherheitsanforderungen-Teil des Vertrags erstellen könnenWhether you can make explicit security requirements part of the contract.

  • Die Einschränkungen für Vorgangseingaben und -ausgabenThe restrictions for operation inputs and outputs.

Klassen oder SchnittstellenClasses or Interfaces

Klassen und Schnittstellen stellen funktionsgruppierungen dar. und aus diesem Grund können beide zum Definieren eines WCF-Dienstvertrags verwendet werden.Both classes and interfaces represent a grouping of functionality and, therefore, both can be used to define a WCF service contract. Es wird allerdings empfohlen, Schnittstellen zu verwenden, da sie Dienstverträge direkt modellieren.However, it is recommended that you use interfaces because they directly model service contracts. Ohne Implementierung definieren Schnittstellen lediglich eine Gruppierung von Methoden mit bestimmten Signaturen.Without an implementation, interfaces do no more than define a grouping of methods with certain signatures. Implementieren eine dienstvertragsschnittstelle, und Sie haben einen WCF-Dienst implementiert.Implement a service contract interface and you have implemented a WCF service.

Dienstvertragsschnittstellen bieten dieselben Vorteile wie verwaltete Schnittstellen:All the benefits of managed interfaces apply to service contract interfaces:

  • Dienstvertragsschnittstellen können jede Anzahl anderer Dienstvertragsschnittstellen erweitern.Service contract interfaces can extend any number of other service contract interfaces.

  • Eine einzelne Klasse kann jede Anzahl von Dienstverträgen implementieren, indem sie diese Dienstvertragsschnittstelle implementiert.A single class can implement any number of service contracts by implementing those service contract interfaces.

  • Sie können die Implementierung eines Dienstvertrags bearbeiten, indem Sie die Schnittstellenimplementierung ändern, während der Dienstvertrag unverändert bleibt.You can modify the implementation of a service contract by changing the interface implementation, while the service contract remains the same.

  • Sie können verschiedene Versionen eines Diensts erstellen, indem Sie die alte und die neue Schnittstelle implementieren.You can version your service by implementing the old interface and the new one. Alte Clients stellen eine Verbindung mit der ursprünglichen Version her, während neuere Clients eine Verbindung mit der neuen Version herstellen können.Old clients connect to the original version, while newer clients can connect to the newer version.

Hinweis

Bei der Vererbung von anderen Dienstvertragsschnittstellen können Sie Vorgangseigenschaften, wie z. B. den Name und den Namespace, nicht außer Kraft setzen.When inheriting from other service contract interfaces, you cannot override operation properties, such as the name or namespace. Wenn Sie dies dennoch versuchen, erstellen Sie im aktuellen Dienstvertrag einen neuen Vorgang.If you attempt to do so, you create a new operation in the current service contract.

Ein Beispiel zum Erstellen eines Dienstvertrags eine Benutzeroberfläche verwenden, finden Sie unter Vorgehensweise: Erstellen eines Diensts mit einer Vertragsschnittstelle.For an example of using an interface to create a service contract, see How to: Create a Service with a Contract Interface.

Sie können allerdings eine Klasse verwenden, um einen Dienstvertrag zu definieren und gleichzeitig zu implementieren.You can, however, use a class to define a service contract and implement that contract at the same time. Der Vorteil des Erstellens Ihrer Dienste durch direktes Anwenden von ServiceContractAttribute und OperationContractAttribute auf die Klasse und die Methoden der Klasse liegen in der Geschwindigkeit und der Einfachheit.The advantage of creating your services by applying ServiceContractAttribute and OperationContractAttribute directly to the class and the methods on the class, respectively, is speed and simplicity. Die Nachteile liegen darin begründet, dass verwaltete Klassen keine mehrfache Vererbung unterstützen. Als Ergebnis kann immer nur ein Dienstvertrag gleichzeitig implementiert werden.The disadvantages are that managed classes do not support multiple inheritance, and as a result they can only implement one service contract at a time. Außerdem ändern alle Modifikationen der Klasse oder Methode den öffentlichen Vertrag für diesen Dienst, der unveränderte Clients daran hindern kann, Ihren Dienst zu verwenden.In addition, any modification to the class or method signatures modifies the public contract for that service, which can prevent unmodified clients from using your service. Weitere Informationen finden Sie unter implementieren Dienstverträge.For more information, see Implementing Service Contracts.

Ein Beispiel, verwendet eine Klasse, um einen Dienstvertrag zu erstellen und es gleichzeitig implementiert werden, finden Sie unter Vorgehensweise: Erstellen eines Diensts mit einer Vertragsklasse.For an example that uses a class to create a service contract and implements it at the same time, see How to: Create a Service with a Contract Class.

An diesem Punkt sollten Sie den Unterschied zwischen dem Definieren des Dienstvertrags mithilfe einer Schnittstelle und mithilfe einer Klasse kennen.At this point, you should understand the difference between defining your service contract by using an interface and by using a class. Der nächste Schritt besteht darin, zu entscheiden, welche Daten zwischen einem Dienst und seinen Clients hin- und herübergeben werden können.The next step is deciding what data can be passed back and forth between a service and its clients.

Parameter und RückgabewerteParameters and Return Values

Jeder Vorgang verfügt über einen Rückgabewert und einen Parameter, auch wenn diese void sind.Each operation has a return value and a parameter, even if these are void. Im Gegensatz zu einer lokalen Methode, in der Sie Verweise auf Objekte von einem Objekt zu einem anderen übergeben können, werden bei Dienstvorgängen keine Verweise auf Objekte übergeben.However, unlike a local method, in which you can pass references to objects from one object to another, service operations do not pass references to objects. Stattdessen werden Kopien der Objekte übergeben.Instead, they pass copies of the objects.

Das ist wichtig, da jeder in einem Parameter oder einem Rückgabewert verwendete Typ serialisiert werden muss. Das bedeutet, dass es möglich sein muss, ein Objekt dieses Typs in einen Datenstrom und einen Datenstrom in ein Objekt umzuwandeln.This is significant because each type used in a parameter or return value must be serializable; that is, it must be possible to convert an object of that type into a stream of bytes and from a stream of bytes into an object.

Primitive Typen sind standardmäßig, wie viele Typen in .NET Framework, serialisierbar.Primitive types are serializable by default, as are many types in the .NET Framework.

Hinweis

Der Wert der Parameternamen in der Vorgangssignatur ist Teil des Vertrags, und die Groß- und Kleinschreibung wird beachtet.The value of the parameter names in the operation signature are part of the contract and are case sensitive. Wenn Sie denselben Parameternamen lokal verwenden, aber den Namen in den veröffentlichten Metadaten ändern möchten, finden Sie entsprechende Informationen unter System.ServiceModel.MessageParameterAttribute.If you want to use the same parameter name locally but modify the name in the published metadata, see the System.ServiceModel.MessageParameterAttribute.

DatenverträgeData Contracts

Dienstorientierte Anwendungen wie Windows Communication Foundation (WCF)-Anwendungen dienen zur Zusammenarbeit mit einer möglichst großen Anzahl von Clientanwendungen auf Microsoft- und nicht-Microsoft-Plattformen.Service-oriented applications like Windows Communication Foundation (WCF) applications are designed to interoperate with the widest possible number of client applications on both Microsoft and non-Microsoft platforms. Für die höchstmögliche Interoperabilität sollten Sie Ihre Typen mit dem DataContractAttribute- und dem DataMemberAttribute-Attribut markieren, um einen Datenvertrag zu erstellen, der dem Teil des Dienstvertrags entspricht, der die Daten beschreibt, die durch die Dienstvorgänge ausgetauscht werden.For the widest possible interoperability, it is recommended that you mark your types with the DataContractAttribute and DataMemberAttribute attributes to create a data contract, which is the portion of the service contract that describes the data that your service operations exchange.

Datenverträge sind Abonnementverträge: Es werden keine Typen- oder Datenmitglieder serialisiert, es sei denn, Sie wenden das Datenvertragsattribut ausdrücklich an.Data contracts are opt-in style contracts: No type or data member is serialized unless you explicitly apply the data contract attribute. Datenverträge stehen nicht mit dem Zugriffsumfang des verwalteten Codes in Verbindung: Private Datenmitglieder können serialisiert und für den öffentlichen Zugriff an einen beliebigen Ort gesendet werden.Data contracts are unrelated to the access scope of the managed code: Private data members can be serialized and sent elsewhere to be accessed publicly. (Ein einfaches Beispiel einen Datenvertrag, finden Sie unter Vorgehensweise: Erstellen eines grundlegenden Datenvertrags für eine Klasse oder Struktur.) WCF verarbeitet die Definition der zugrunde liegenden SOAP-Nachrichten, die Funktionalität des Vorgangs zu ermöglichen als auch für die Serialisierung von Datentypen in und aus dem Text der Nachrichten.(For a basic example of a data contract, see How to: Create a Basic Data Contract for a Class or Structure.) WCF handles the definition of the underlying SOAP messages that enable the operation's functionality as well as the serialization of your data types into and out of the body of the messages. Solange Ihre Datentypen serialisierbar sind, müssen Sie sich beim Erstellen von Vorgängen keine Gedanken über die zugrunde liegende Meldungsaustauschinfrastruktur machen.As long as your data types are serializable, you do not need to think about the underlying message exchange infrastructure when designing your operations.

Obwohl die normale WCF-Anwendung verwendet die DataContractAttribute und DataMemberAttribute -Attribute zum Erstellen von Datenverträgen für Vorgänge, Sie können auch andere Serialisierungsmechanismen verwenden.Although the typical WCF application uses the DataContractAttribute and DataMemberAttribute attributes to create data contracts for operations, you can use other serialization mechanisms. Die standardmäßigen ISerializable, SerializableAttribute und IXmlSerializable-Mechanismen können alle zum Serialisieren Ihrer Datentypen in den zugrunde liegenden SOAP-Meldungen verwendet werden, durch die sie von einer Anwendung zu einer anderen transportiert werden.The standard ISerializable, SerializableAttribute and IXmlSerializable mechanisms all work to handle the serialization of your data types into the underlying SOAP messages that carry them from one application to another. Sie können weitere Serialisierungsstrategien anwenden, wenn die Datentypen spezielle Unterstützung benötigen.You can employ more serialization strategies if your data types require special support. Weitere Informationen zu den Optionen für die Serialisierung von Datentypen in WCF-Anwendungen, finden Sie unter angeben von Datenübertragung in Dienstverträgen.For more information about the choices for serialization of data types in WCF applications, see Specifying Data Transfer in Service Contracts.

Zuordnen von Parametern und Rückgabewerten zu NachrichtenaustauschvorgängenMapping Parameters and Return Values to Message Exchanges

Dienstvorgänge werden von einem zugrunde liegenden Austausch von SOAP-Meldungen unterstützt, die Anwendungsdaten hin- und herübertragen, zusätzlich zu den Daten, die die Anwendung benötigt, um bestimmte standardmäßige Sicherheits-, Transaktions- und Sitzungsfunktionen zu unterstützen.Service operations are supported by an underlying exchange of SOAP messages that transfer application data back and forth, in addition to the data required by the application to support certain standard security, transaction, and session-related features. Da dies der Fall ist, bestimmt die Signatur eines Dienstvorgangs, ein bestimmtes zugrunde liegendes Nachrichtenaustauschmuster (MEP), die die Datenübertragung und die Funktionen, die ein Vorgang erfordert unterstützen können.Because this is the case, the signature of a service operation dictates a certain underlying message exchange pattern (MEP) that can support the data transfer and the features an operation requires. Sie können drei Muster im Modell WCF-Programmierung angeben: Anforderung/Antwort, unidirektional und duplex-Nachrichtenmuster.You can specify three patterns in the WCF programming model: request/reply, one-way, and duplex message patterns.

Anforderung/AntwortRequest/Reply

Anforderung/Antwort ist ein Muster, in dem ein Anforderungssender (eine Clientanwendung) eine Antwort empfängt, mit der die Anfrage kombiniert wird.A request/reply pattern is one in which a request sender (a client application) receives a reply with which the request is correlated. Dabei handelt es sich um das standardmäßige Meldungsaustauschmuster, da es einen Vorgang unterstützt, in dem mindestens ein Parameter an den Vorgang übergeben und ein Rückgabewert zurück an den Aufrufer übergeben wird.This is the default MEP because it supports an operation in which one or more parameters are passed to the operation and a return value is passed back to the caller. Das folgende C#-Codebeispiel zeigt einen einfachen Dienstvorgang, der eine Zeichenfolge als Parameter akzeptiert und eine Zeichenfolge zurückgibt:For example, the following C# code example shows a basic service operation that takes one string and returns a string.

[OperationContractAttribute]  
string Hello(string greeting);  

Im Folgenden sehen Sie den entsprechenden Visual Basic-Code:The following is the equivalent Visual Basic code.

<OperationContractAttribute()>  
Function Hello (ByVal greeting As String) As String  

Diese Vorgangssignatur schreibt die Form des zugrunde liegenden Meldungsaustauschs vor.This operation signature dictates the form of underlying message exchange. Wenn keine Korrelation vorhanden war, kann WCF nicht bestimmen, für welchen Vorgang der Rückgabewert vorgesehen ist.If no correlation existed, WCF cannot determine for which operation the return value is intended.

Beachten Sie, die, wenn Sie ein anderes zugrunde liegendes Meldungsmuster angeben auch Dienstvorgänge, die, die zurückgeben void (Nothing in Visual Basic) sind Anforderung/Antwort-Nachrichtenaustausch.Note that unless you specify a different underlying message pattern, even service operations that return void (Nothing in Visual Basic) are request/reply message exchanges. Als Ergebnis für Ihren Vorgang folgt daraus, dass der Client, falls er den Vorgang nicht asynchron aufruft, die Verarbeitung anhält, bis die Antwortmeldung empfangen wird, auch wenn diese Meldung normalerweise leer ist.The result for your operation is that unless a client invokes the operation asynchronously, the client stops processing until the return message is received, even though that message is empty in the normal case. Das folgende C#-Codebeispiel zeigt einen Vorgang, der erst zurückgegeben wird, wenn der Client als Antwort eine leere Meldung empfangen hat:The following C# code example shows an operation that does not return until the client has received an empty message in response.

[OperationContractAttribute]  
void Hello(string greeting);  

Im Folgenden sehen Sie den entsprechenden Visual Basic-Code:The following is the equivalent Visual Basic code.

<OperationContractAttribute()>  
Sub Hello (ByVal greeting As String)  

Das vorherige Beispiel kann die Clientleistung und die Antwortzeit verschlechtern, wenn der Vorgang lange Zeit dauert. Anforderungs-/Antwort-Vorgänge haben aber selbst dann Vorteile, wenn sie void zurückgeben.The preceding example can slow client performance and responsiveness if the operation takes a long time to perform, but there are advantages to request/reply operations even when they return void. Der offensichtlichste Vorteil besteht darin, dass SOAP-Fehler in der Antwortnachricht zurückgegeben werden können, die anzeigen, dass in der Kommunikation oder Verarbeitung dienstbedingte Fehlerbedingungen eingetreten sind.The most obvious one is that SOAP faults can be returned in the response message, which indicates that some service-related error condition has occurred, whether in communication or processing. SOAP-Fehler, die in einem Dienstvertrag angegeben werden, werden der Clientanwendung als FaultException<TDetail>-Objekte übergeben, wobei der Typparameter dem im Dienstvertrag angegebenen Typ entspricht.SOAP faults that are specified in a service contract are passed to the client application as a FaultException<TDetail> object, where the type parameter is the type specified in the service contract. Dies erleichtert das Benachrichtigen von Clients über fehlerbedingungen in WCF-Diensten.This makes notifying clients about error conditions in WCF services easy. Weitere Informationen zu Ausnahmen, die SOAP-Fehlern und Fehlerbehandlung finden Sie unter angeben und Behandeln von Fehlern in Verträgen und Diensten.For more information about exceptions, SOAP faults, and error handling, see Specifying and Handling Faults in Contracts and Services. Ein Beispiel für eine Anforderung/Antwort-Dienst und Client finden Sie unter Vorgehensweise: Erstellen Sie einen Anforderung-Antwort-Vertrag.To see an example of a request/reply service and client, see How to: Create a Request-Reply Contract. Weitere Informationen zu Problemen mit der Anforderung-Antwort-Muster finden Sie unter Anforderung-Antwort-Dienste.For more information about issues with the request-reply pattern, see Request-Reply Services.

UnidirektionalOne-way

Wenn der Client eine WCF-dienstanwendung nicht zum Abschließen des Vorgangs warten soll und keine SOAP-Fehler verarbeitet, kann ein unidirektionales Nachrichtenmuster Vorgang angegeben werden.If the client of a WCF service application should not wait for the operation to complete and does not process SOAP faults, the operation can specify a one-way message pattern. Ein unidirektionaler Vorgang ist ein in dem ein Client Ruft einen Vorgang, und setzt die Verarbeitung nach WCF die Nachricht mit dem Netzwerk schreibt fort.A one-way operation is one in which a client invokes an operation and continues processing after WCF writes the message to the network. Normalerweise bedeutet dies, dass der Client die Ausführung fast unverzüglich fortsetzt, sofern die in der ausgehenden Nachricht enthaltene Datenmenge nicht übermäßig groß ist (und sofern beim Senden der Daten kein Fehler auftritt).Typically this means that unless the data being sent in the outbound message is extremely large the client continues running almost immediately (unless there is an error sending the data). Dieser Typ des Nachrichtenaustauschmusters unterstützt ereignisähnliches Verhalten gegenüber einem Client zu einer Dienstanwendung.This type of message exchange pattern supports event-like behavior from a client to a service application.

Ein Meldungsaustausch, in dem eine Meldung gesendet und keine empfangen wird, kann keinen Dienstvorgang unterstützen, der einen anderen Rückgabewert als void angibt. In diesem Fall wird eine InvalidOperationException-Ausnahme ausgelöst.A message exchange in which one message is sent and none are received cannot support a service operation that specifies a return value other than void; in this case an InvalidOperationException exception is thrown.

Eine fehlende Rückgabemeldung bedeutet außerdem, dass keine SOAP-Fehler zurückgegeben werden können, um Fehler bei Bearbeitung und Kommunikation anzuzeigen.No return message also means that there can be no SOAP fault returned to indicate any errors in processing or communication. (Kommunizieren von Fehlerinformationen bei unidirektionalen Vorgängen erfordert ein Duplex-Meldungsaustauschmuster.)(Communicating error information when operations are one-way operations requires a duplex message exchange pattern.)

Um einen unidirektionalen Meldungsaustausch für einen Vorgang anzugeben, der void zurückgibt, legen Sie die IsOneWay-Eigenschaft auf true fest, wie im folgenden C#-Codebeispiel gezeigt:To specify a one-way message exchange for an operation that returns void, set the IsOneWay property to true, as in the following C# code example.

[OperationContractAttribute(IsOneWay=true)]  
void Hello(string greeting);  

Im Folgenden sehen Sie den entsprechenden Visual Basic-Code:The following is the equivalent Visual Basic code.

<OperationContractAttribute(IsOneWay := True)>  
Sub Hello (ByVal greeting As String)  

Diese Methode ist mit dem vorherigen Anforderungs-/Antwortbeispiel identisch, aber das Festlegen der IsOneWay-Eigenschaft auf true bedeutet, dass der Dienstvorgang, obwohl die Methode identisch ist, keine Rückgabemeldung sendet und Clients unverzüglich zurückgegeben werden, sobald die ausgehende Meldung der Kanalebene übergeben wurde.This method is identical to the preceding request/reply example, but setting the IsOneWay property to true means that although the method is identical, the service operation does not send a return message and clients return immediately once the outbound message has been handed to the channel layer. Ein Beispiel finden Sie unter Vorgehensweise: Erstellen eines unidirektionalen Vertrags.For an example, see How to: Create a One-Way Contract. Weitere Informationen über das unidirektionale Muster finden Sie unter unidirektionaler Services.For more information about the one-way pattern, see One-Way Services.

DuplexDuplex

Ein Duplexmuster wird durch die Fähigkeit des Diensts und des Clients zum unabhängigen Senden von Nachrichten untereinander charakterisiert, wenn unidirektionale oder Anforderungs-/Antwortmeldungen verwendet werden.A duplex pattern is characterized by the ability of both the service and the client to send messages to each other independently whether using one-way or request/reply messaging. Diese Form einer bidirektionalen Kommunikation ist für Dienste nützlich, die direkt mit dem Client kommunizieren müssen, oder zum Bereitstellen einer asynchronen Erfahrung auf beiden Seiten eines Nachrichtenaustauschs, einschließlich ereignisähnlichen Verhaltens.This form of two-way communication is useful for services that must communicate directly to the client or for providing an asynchronous experience to either side of a message exchange, including event-like behavior.

Das Duplexmuster ist aufgrund der zusätzlichen Mechanismen für die Kommunikation mit dem Client etwas komplexer als das Anforderungs-/Antwortmuster und das unidirektionale Muster.The duplex pattern is slightly more complex than the request/reply or one-way patterns because of the additional mechanism for communicating with the client.

Für einen Duplexvertrag müssen Sie auch einen Rückrufvertrag entwerfen und den Typ dieses Rückrufvertrags der CallbackContract-Eigenschaft des ServiceContractAttribute-Attributs zuweisen, das den Dienstvertrag markiert.To design a duplex contract, you must also design a callback contract and assign the type of that callback contract to the CallbackContract property of the ServiceContractAttribute attribute that marks your service contract.

Zum Implementieren eines Duplexmusters müssen Sie eine zweite Schnittstelle erstellen, die die Methodendeklarierungen enthält, die auf dem Client aufgerufen werden.To implement a duplex pattern, you must create a second interface that contains the method declarations that are called on the client.

Ein Beispiel zum Erstellen eines Diensts und einem Client, der diesen Dienst zugreift, finden Sie unter Vorgehensweise: Erstellen eines Duplexvertrags und Vorgehensweise: Access Services mit einem Duplexvertrag.For an example of creating a service, and a client that accesses that service, see How to: Create a Duplex Contract and How to: Access Services with a Duplex Contract. Ein funktionierendes Beispiel finden Sie unter Duplex.For a working sample, see Duplex. Weitere Informationen zu Problemen mit Duplexverträgen finden Sie unter Duplexdienste.For more information about issues using duplex contracts, see Duplex Services.

Achtung

Wenn ein Dienst eine Duplexmeldung empfängt, überprüft er das ReplyTo-Element in dieser eingehenden Meldung, um zu bestimmen, wohin die Antwort gesendet werden soll.When a service receives a duplex message, it looks at the ReplyTo element in that incoming message to determine where to send the reply. Wenn der zum Empfangen der Meldung verwendete Kanal nicht gesichert ist, kann ein nicht vertrauenswürdiger Client eine bösartige Meldung mit dem ReplyTo-Element eines Zielcomputers senden, was zu einem Denial Of Service (DOS) auf diesem Zielcomputer führt.If the channel that is used to receive the message is not secured, then an untrusted client could send a malicious message with a target machine's ReplyTo, leading to a denial of service (DOS) of that target machine.

Out-Parameter und Ref-ParameterOut and Ref Parameters

In den meisten Fällen können Sie in Parameter (ByVal in Visual Basic) und out und ref Parameter (ByRef in Visual Basic).In most cases, you can use in parameters (ByVal in Visual Basic) and out and ref parameters (ByRef in Visual Basic). Da die out- und ref-Parameter anzeigen, dass Daten aus einem Vorgang zurückgegeben werden, gibt eine Vorgangssignatur wie die folgende an, dass ein Anforderungs-/Antwortvorgang erforderlich ist, obwohl die Vorgangssignatur void zurückgibt.Because both out and ref parameters indicate that data is returned from an operation, an operation signature such as the following specifies that a request/reply operation is required even though the operation signature returns void.

[ServiceContractAttribute]  
public interface IMyContract  
{  
  [OperationContractAttribute]  
  public void PopulateData(ref CustomDataType data);  
}  

Im Folgenden sehen Sie den entsprechenden Visual Basic-Code:The following is the equivalent Visual Basic code.

<ServiceContractAttribute()> _  
Public Interface IMyContract  
  <OperationContractAttribute()> _  
  Public Sub PopulateData(ByRef data As CustomDataType)  
End Interface  

Die einzigen Ausnahmen sind jene Fälle, in denen die Signatur über eine besondere Struktur verfügt.The only exceptions are those cases in which your signature has a particular structure. Sie können beispielsweise die NetMsmqBinding-Bindung nur dann zum Kommunizieren mit Clients verwenden, wenn die zum Deklarieren eines Vorgangs verwendete Methode void zurückgibt. Es dürfen keine Ausgabewerte vorliegen, weder ein Rückgabewert noch ein ref-Parameter oder ein out-Parameter.For example, you can use the NetMsmqBinding binding to communicate with clients only if the method used to declare an operation returns void; there can be no output value, whether it is a return value, ref, or out parameter.

Außerdem ist bei der Verwendung der out- und ref-Parameter erforderlich, dass der Vorgang über eine zugrunde liegende Antwortmeldung verfügt, um das geänderte Objekt zurückzugeben.In addition, using out or ref parameters requires that the operation have an underlying response message to carry back the modified object. Wenn es sich bei dem Vorgang um einen unidirektionalen Vorgang handelt, wird zur Laufzeit eine Ausnahme des Typs InvalidOperationException ausgelöst.If your operation is a one-way operation, an InvalidOperationException exception is thrown at runtime.

Angeben einer Meldungsschutzebene für den VertragSpecify Message Protection Level on the Contract

Wenn Sie den Vertrag entwerfen, müssen Sie sich außerdem für eine Meldungsschutzebene für Dienste entscheiden, die den Vertrag implementieren.When designing your contract, you must also decide the message protection level of services that implement your contract. Dies ist nur notwendig, wenn Meldungssicherheit auf die Bindung im Endpunkt des Vertrags angewendet wird.This is necessary only if message security is applied to the binding in the contract's endpoint. Wenn die Sicherheit für die Bindung deaktivert wurde (wenn also die vom System bereitgestellte Bindung den System.ServiceModel.SecurityMode auf den Wert SecurityMode.None festlegt), müssen Sie sich nicht für eine Meldungsschutzebene für den Vertrag entscheiden.If the binding has security turned off (that is, if the system-provided binding sets the System.ServiceModel.SecurityMode to the value SecurityMode.None) then you do not have to decide on the message protection level for the contract. In den meisten Fällen bieten vom System bereitgestellte Bindungen mit angewendeter Sicherheit auf Nachrichtenebenen eine ausreichende Schutzebene, sodass Sie sich nicht bei jedem Vorgang oder jeder Nachricht Gedanken um die Schutzebene machen müssen.In most cases, system-provided bindings with message-level security applied provide a sufficient protection level and you do not have to consider the protection level for each operation or for each message.

Die Schutzebene ist ein Wert, der angibt, ob die Meldungen (oder Meldungsteile), die einen Dienst unterstützen, signiert, signiert und verschlüsselt oder ohne Signaturen und Verschlüsselung gesendet werden.The protection level is a value that specifies whether the messages (or message parts) that support a service are signed, signed and encrypted, or sent without signatures or encryption. Die Schutzebene kann in unterschiedlichem Umfang festgelegt werden: auf Dienstebene, für einen bestimmten Vorgang, für eine Meldung innerhalb dieses Vorgangs oder für einen Meldungsteil.The protection level can be set at various scopes: At the service level, for a particular operation, for a message within that operation, or a message part. Auf einen Bereich festgelegte Werte werden zum Standardwert für kleinere Bereiche, außer wenn diese explizit außer Kraft gesetzt werden.Values set at one scope become the default value for smaller scopes unless explicitly overridden. Wenn eine Bindungskonfiguration die erforderliche Mindestschutzebene für den Vertrag nicht bereitstellen kann, wird eine Ausnahme ausgegeben.If a binding configuration cannot provide the required minimum protection level for the contract, an exception is thrown. Wenn für den Vertrag keine Schutzebenenwerte explizit festgelegt sind, steuert die Bindungskonfiguration die Schutzebene für alle Meldungen, sofern die Bindung über Meldungssicherheit verfügt.And when no protection level values are explicitly set on the contract, the binding configuration controls the protection level for all messages if the binding has message security. Dies ist das Standardverhalten.This is the default behavior.

Wichtig

Die Entscheidung über das explizite Festlegen verschiedener Umfänge eines Vertrags auf weniger als die vollständige Schutzebene von ProtectionLevel.EncryptAndSign ist normalerweise eine Entscheidung, die die Leistung verbessert, während die Sicherheit reduziert wird.Deciding whether to explicitly set various scopes of a contract to less than the full protection level of ProtectionLevel.EncryptAndSign is generally a decision that trades some degree of security for increased performance. In diesen Fällen hängen Ihre Entscheidungen von den Vorgängen und dem Wert der ausgetauschten Daten ab.In these cases, your decisions must revolve around your operations and the value of the data they exchange. Weitere Informationen finden Sie unter Sichern von Services.For more information, see Securing Services.

Im folgenden Codebeispiel wird weder die ProtectionLevel- noch die ProtectionLevel-Eigenschaft für den Vertrag festgelegt.For example, the following code example does not set either the ProtectionLevel or the ProtectionLevel property on the contract.

[ServiceContract]  
public interface ISampleService  
{  
  [OperationContractAttribute]  
  public string GetString();  

  [OperationContractAttribute]  
  public int GetInt();    
}  

Im Folgenden sehen Sie den entsprechenden Visual Basic-Code:The following is the equivalent Visual Basic code.

<ServiceContractAttribute()> _  
Public Interface ISampleService  

  <OperationContractAttribute()> _  
  Public Function GetString()As String  

  <OperationContractAttribute()> _  
  Public Function GetData() As Integer  

End Interface  

Beim Interagieren mit einer ISampleService-Implementierung in einem Endpunkt mit einer standardmäßigen WSHttpBinding (der standardmäßige System.ServiceModel.SecurityMode ist Message) werden alle Meldungen verschlüsselt und signiert, da es sich dabei um die Standardschutzebene handelt.When interacting with an ISampleService implementation in an endpoint with a default WSHttpBinding (the default System.ServiceModel.SecurityMode, which is Message), all messages are encrypted and signed because this is the default protection level. Wenn jedoch ein ISampleService-Dienst mit einer standardmäßigen BasicHttpBinding verwendet wird (der standardmäßige SecurityMode ist None), werden alle Nachrichten als Text gesendet, da es keine Sicherheit für diese Bindung gibt und somit die Schutzebene ignoriert wird (die Nachrichten werden also weder verschlüsselt noch signiert).However, when an ISampleService service is used with a default BasicHttpBinding (the default SecurityMode, which is None), all messages are sent as text because there is no security for this binding and so the protection level is ignored (that is, the messages are neither encrypted nor signed). Würde der SecurityMode in Message geändert, würden die Nachrichten verschlüsselt und signiert (da es sich in diesem Fall um die Standardschutzebene der Bindung handeln würde).If the SecurityMode was changed to Message, then these messages would be encrypted and signed (because that would now be the binding's default protection level).

Wenn Sie die Schutzanforderungen für den Vertrag explizit angeben oder anpassen möchten, legen Sie die ProtectionLevel-Eigenschaft (oder die ProtectionLevel-Eigenschaften im kleineren Umfang) auf die für den Dienstvertrag erforderliche Ebene fest.If you want to explicitly specify or adjust the protection requirements for your contract, set the ProtectionLevel property (or any of the ProtectionLevel properties at a smaller scope) to the level your service contract requires. In diesem Fall ist bei der Verwendung einer expliziten Einstellung erforderlich, dass die Bindung diese Einstellung mindestens für den verwendeten Umfang unterstützt.In this case, using an explicit setting requires the binding to support that setting at a minimum for the scope used. Im folgenden Codebeispiel wird ein ProtectionLevel-Wert explizit für den GetGuid-Vorgang angegeben.For example, the following code example specifies one ProtectionLevel value explicitly, for the GetGuid operation.

[ServiceContract]  
public interface IExplicitProtectionLevelSampleService  
{  
  [OperationContractAttribute]  
  public string GetString();  

  [OperationContractAttribute(ProtectionLevel=ProtectionLevel.None)]  
  public int GetInt();    
  [OperationContractAttribute(ProtectionLevel=ProtectionLevel.EncryptAndSign)]  
  public int GetGuid();    
}  

Im Folgenden sehen Sie den entsprechenden Visual Basic-Code:The following is the equivalent Visual Basic code.

<ServiceContract()> _   
Public Interface IExplicitProtectionLevelSampleService   
    <OperationContract()> _   
    Public Function GetString() As String   
    End Function   

    <OperationContract(ProtectionLevel := ProtectionLevel.None)> _   
    Public Function GetInt() As Integer   
    End Function   

    <OperationContractAttribute(ProtectionLevel := ProtectionLevel.EncryptAndSign)> _   
    Public Function GetGuid() As Integer   
    End Function   

End Interface  

Ein Dienst, der diesen IExplicitProtectionLevelSampleService-Vertrag implementiert und über einen Endpunkt verfügt, der die standardmäßige WSHttpBinding (der standardmäßige System.ServiceModel.SecurityMode ist Message) verwendet, hat das folgende Verhalten:A service that implements this IExplicitProtectionLevelSampleService contract and has an endpoint that uses the default WSHttpBinding (the default System.ServiceModel.SecurityMode, which is Message) has the following behavior:

  • Die GetString-Vorgangsmeldungen werden verschlüsselt und signiert.The GetString operation messages are encrypted and signed.

  • Die GetInt-Vorgangsmeldungen werden als unverschlüsselter und unsignierter Text gesendet.The GetInt operation messages are sent as unencrypted and unsigned (that is, plain) text.

  • Der GetGuid-Vorgang System.Guid wird in einer Nachricht zurückgegeben, die verschlüsselt und signiert wird.The GetGuid operation System.Guid is returned in a message that is encrypted and signed.

Weitere Informationen zu Schutzebenen und deren Verwendung finden Sie unter Verständnis Schutzebene.For more information about protection levels and how to use them, see Understanding Protection Level. Weitere Informationen zur Sicherheit finden Sie unter Sichern von Services.For more information about security, see Securing Services.

Andere VorgangssignaturanforderungenOther Operation Signature Requirements

Einige Anwendungsfunktionen erfordern eine besondere Art von Vorgangssignatur.Some application features require a particular kind of operation signature. Die NetMsmqBinding-Bindung unterstützt beispielsweise permanente Dienste und Clients, in denen eine Anwendung während der Kommunikation neu gestartet und ohne Meldungsverlust genau dort fortgesetzt werden kann, wo sie angehalten wurde.For example, the NetMsmqBinding binding supports durable services and clients, in which an application can restart in the middle of communication and pick up where it left off without missing any messages. (Weitere Informationen finden Sie unter Warteschlangen in WCF.) Permanente Vorgänge dürfen allerdings nur einen in-Parameter verwenden und haben keinen Rückgabewert.(For more information, see Queues in WCF.) However, durable operations must take only one in parameter and have no return value.

Ein anderes Beispiel ist die Verwendung von Stream-Typen in Vorgängen.Another example is the use of Stream types in operations. Da der Stream-Parameter den gesamten Textinhalt einschließt, muss es sich bei einer Ein- oder Ausgabe mit den Parametern ref, out oder einem Rückgabewert vom Typ Stream um die einzigen im Vorgang angegebenen Ein- und Ausgaben handeln.Because the Stream parameter includes the entire message body, if an input or an output (that is, ref parameter, out parameter, or return value) is of type Stream, then it must be the only input or output specified in your operation. Außerdem muss es sich bei dem Parameter oder dem Rückgabetyp um Stream, System.ServiceModel.Channels.Message oder System.Xml.Serialization.IXmlSerializable handeln.In addition, the parameter or return type must be either Stream, System.ServiceModel.Channels.Message, or System.Xml.Serialization.IXmlSerializable. Weitere Informationen zu Streams, finden Sie unter umfangreiche Daten und Streaming.For more information about streams, see Large Data and Streaming.

Namen, Namespaces und ObfuskationNames, Namespaces, and Obfuscation

Die Namen und Namespaces der .NET-Typen in der Definition von Verträgen und Vorgängen sind wichtig, wenn Verträge in WSDL konvertiert und wenn Vertragsnachrichten erstellt und gesendet werden.The names and namespaces of the .NET types in the definition of contracts and operations are significant when contracts are converted into WSDL and when contract messages are created and sent. Aus diesem Grund sollten Namen und Namespaces von Verträgen unbedingt explizit mithilfe der Name- und der Namespace-Eigenschaft aller unterstützenden Vertragsattribute (wie ServiceContractAttribute, OperationContractAttribute, DataContractAttribute, DataMemberAttribute und anderer Vertragsattribute) festgelegt werden.Therefore, it is strongly recommended that service contract names and namespaces are explicitly set using the Name and Namespace properties of all supporting contract attributes such as the ServiceContractAttribute, OperationContractAttribute, DataContractAttribute, DataMemberAttribute, and other contract attributes.

Sind die Namen und Namespaces nicht explizit festgelegt, verändert die Verwendung der IL-Obfuskation für die Assembly die Namen und Namespaces des Vertragstyps. Dadurch ergeben sich Änderungen beim WSDL- und Übertragungsaustausch, wodurch üblicherweise Fehler auftreten.One result of this is that if the names and namespaces are not explicitly set, the use of IL obfuscation on the assembly alters the contract type names and namespaces and results in modified WSDL and wire exchanges that typically fail. Wenn Sie die Vertragsnamen und -Namespaces nicht explizit festlegen, aber dennoch das Verbergen verwenden möchten, unterbinden Sie Änderungen an den Namen und Namespaces des Vertragstyps mithilfe des ObfuscationAttribute-Attributs und des ObfuscateAssemblyAttribute-Attributs.If you do not set the contract names and namespaces explicitly but do intend to use obfuscation, use the ObfuscationAttribute and ObfuscateAssemblyAttribute attributes to prevent the modification of the contract type names and namespaces.

Siehe auchSee Also

Vorgehensweise: Erstellen eines Anforderung-Antwort-VertragsHow to: Create a Request-Reply Contract
Vorgehensweise: Erstellen eines unidirektionalen VertragsHow to: Create a One-Way Contract
Vorgehensweise: Erstellen eines DuplexvertragsHow to: Create a Duplex Contract
Angeben von Datenübertragung in DienstverträgenSpecifying Data Transfer in Service Contracts
Angeben und Behandeln von Fehlern in Verträgen und DienstenSpecifying and Handling Faults in Contracts and Services
Verwenden von SitzungenUsing Sessions
Synchrone und asynchrone VorgängeSynchronous and Asynchronous Operations
Zuverlässige DiensteReliable Services
Dienste und TransaktionenServices and Transactions