ServiceContractAttribute Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Gibt an, dass eine Schnittstelle oder eine Klasse einen Dienstvertrag in einer WCF-Anwendung (Windows Communication Foundation) definiert.
public ref class ServiceContractAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple=false, Inherited=false)]
public sealed class ServiceContractAttribute : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, Inherited=false)]
public sealed class ServiceContractAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple=false, Inherited=false)>]
type ServiceContractAttribute = class
inherit Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, Inherited=false)>]
type ServiceContractAttribute = class
inherit Attribute
Public NotInheritable Class ServiceContractAttribute
Inherits Attribute
- Vererbung
- Attribute
Beispiele
Im folgenden Codebeispiel wird gezeigt, wie ServiceContractAttribute auf eine Schnittstelle angewendet wird, um einen Dienstvertrag mit einer Dienstmethode zu definieren, die durch OperationContractAttribute angegeben wird. In diesem Fall ist die erforderliche Schutzebene der Bindungen für alle Nachrichten ProtectionLevel.EncryptAndSign.
Im Codebeispiel wird dieser Vertrag dann über die SampleService
-Klasse implementiert.
using System;
using System.Collections.Generic;
using System.Net.Security;
using System.ServiceModel;
using System.Text;
namespace Microsoft.WCF.Documentation
{
[ServiceContract(
Namespace="http://microsoft.wcf.documentation",
Name="SampleService",
ProtectionLevel=ProtectionLevel.EncryptAndSign
)]
public interface ISampleService{
[OperationContract]
string SampleMethod(string msg);
}
class SampleService : ISampleService
{
#region ISampleService Members
public string SampleMethod(string msg)
{
return "The service greets you: " + msg;
}
#endregion
}
}
Imports System.Collections.Generic
Imports System.Net.Security
Imports System.ServiceModel
Imports System.Text
Namespace Microsoft.WCF.Documentation
<ServiceContract(Namespace:="http://microsoft.wcf.documentation", Name:="SampleService", ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _
Public Interface ISampleService
<OperationContract> _
Function SampleMethod(ByVal msg As String) As String
End Interface
Friend Class SampleService
Implements ISampleService
#Region "ISampleService Members"
Public Function SampleMethod(ByVal msg As String) As String Implements ISampleService.SampleMethod
Return "The service greets you: " & msg
End Function
#End Region
End Class
End Namespace
Im folgenden Codebeispiel wird eine einfache Konfigurationsdatei für den vorangehenden Dienst gezeigt, die einen Endpunkt erstellt.
<configuration>
<system.serviceModel>
<services>
<service
name="Microsoft.WCF.Documentation.SampleService"
behaviorConfiguration="mex"
>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/SampleService"/>
</baseAddresses>
</host>
<endpoint
address=""
binding="wsHttpBinding"
contract="Microsoft.WCF.Documentation.ISampleService"
/>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="mex">
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Im folgenden Codebeispiel wird ein einfacher Client gezeigt, der den vorangehenden SampleService
aufruft.
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
public class Client
{
public static void Main()
{
// Picks up configuration from the config file.
SampleServiceClient wcfClient = new SampleServiceClient();
try
{
// Making calls.
Console.WriteLine("Enter the greeting to send: ");
string greeting = Console.ReadLine();
Console.WriteLine("The service responded: " + wcfClient.SampleMethod(greeting));
Console.WriteLine("Press ENTER to exit:");
Console.ReadLine();
// Done with service.
wcfClient.Close();
Console.WriteLine("Done!");
}
catch (TimeoutException timeProblem)
{
Console.WriteLine("The service operation timed out. " + timeProblem.Message);
wcfClient.Abort();
Console.Read();
}
catch(CommunicationException commProblem)
{
Console.WriteLine("There was a communication problem. " + commProblem.Message);
wcfClient.Abort();
Console.Read();
}
}
}
Imports System.ServiceModel
Imports System.ServiceModel.Channels
Public Class Client
Public Shared Sub Main()
' Picks up configuration from the config file.
Dim wcfClient As New SampleServiceClient()
Try
' Making calls.
Console.WriteLine("Enter the greeting to send: ")
Dim greeting = Console.ReadLine()
Console.WriteLine("The service responded: " & wcfClient.SampleMethod(greeting))
Console.WriteLine("Press ENTER to exit:")
Console.ReadLine()
' Done with service.
wcfClient.Close()
Console.WriteLine("Done!")
Catch timeProblem As TimeoutException
Console.WriteLine("The service operation timed out. " & timeProblem.Message)
wcfClient.Abort()
Console.Read()
Catch commProblem As CommunicationException
Console.WriteLine("There was a communication problem. " & commProblem.Message)
wcfClient.Abort()
Console.Read()
End Try
End Sub
End Class
Hinweise
Verwenden Sie das ServiceContractAttribute-Attribut in einer Schnittstelle (oder Klasse), um einen Dienstvertrag zu definieren. Verwenden Sie dann das OperationContractAttribute-Attribut in einer oder mehreren Klassenmethoden (oder Schnittstellenmethoden), um die Dienstvertragvorgänge zu definieren. Wenn der Dienstvertrag implementiert und mit einer Bindung und einem EndpointAddress Objekt kombiniert wird, wird der Dienstvertrag für die Verwendung von Clients verfügbar gemacht. Eine Übersicht über den Prozess mit einfachen Beispielen finden Sie unter Erste Schritte Lernprogramm. Weitere Informationen zum Erstellen von Dienstverträgen finden Sie unter Entwerfen und Implementieren von Diensten.
Die von einem ServiceContractAttribute wiedergegebenen Informationen und seine Schnittstelle hängen lose mit dem Web Services Description Language (WSDL)-<portType>
-Element zusammen. Ein Dienstvertrag wird auf der Dienstseite verwendet, um anzugeben, was der Endpunkt des Diensts anrufern verfügbar macht. Er wird außerdem auf Clientseite verwendet, um den Vertrag des Endpunkts anzugeben, mit dem der Client kommuniziert, und um im Fall von Duplexverträgen den Rückrufvertrag anzugeben (unter Verwendung der CallbackContract-Eigenschaft), den der Client implementieren muss, um an einer Duplexkonversation teilzunehmen.
Hinweis
Eine Schnittstelle oder Klasse, der ServiceContractAttribute zugeordnet ist, muss mindestens eine Methode aufweisen, die mit dem OperationContractAttribute-Attribut markiert ist, um Funktionen bereitstellen zu können. Im Beispielabschnitt finden Sie ein Codebeispiel, in dem die beiden Attribute auf einfache Weise zum Definieren und Implementieren eines Diensts eingesetzt werden.
Verwenden Sie die ServiceContractAttribute-Eigenschaften, um den Dienstvertrag zu ändern.
Die ConfigurationName-Eigenschaft gibt den Namen des Dienstelements in der zu verwendenden Konfigurationsdatei an.
Die Name-Eigenschaft und die Namespace-Eigenschaft steuern den Namen und den Namespace des Vertrags im WSDL-
<portType>
-Element.Die SessionMode-Eigenschaft gibt an, ob der Vertrag eine Bindung erfordert, die Sitzungen unterstützt.
Die CallbackContract-Eigenschaft gibt den Rückgabevertrag in einer bidirektionalen (Duplex-) Konversation an.
Die HasProtectionLevel-Eigenschaft und die ProtectionLevel-Eigenschaft geben an, ob alle den Vertrag unterstützenden Nachrichten einen expliziten ProtectionLevel-Wert haben, und wenn ja, welcher Stufe sie angehören.
Dienste implementieren Dienstverträge, die den von einem Diensttyp unterstützten Datenaustausch darstellen. Eine Dienstklasse kann einen Dienstvertrag implementieren (durch Implementierung einer mit ServiceContractAttribute markierten Schnittstelle, die Methoden aufweist, die mit OperationContractAttribute markiert sind), oder sie kann mit ServiceContractAttribute markiert werden und das OperationContractAttribute-Attribut auf seine eigenen Methoden anwenden. (Wenn eine Klasse eine Schnittstelle implementiert, die mit ServiceContractAttributegekennzeichnet ist, kann sie nicht selbst mit ServiceContractAttribute.) Methoden für Diensttypen, die mit der OperationContractAttribute Markierung gekennzeichnet sind, werden als Teil eines Standarddienstvertrags behandelt, der vom Diensttyp selbst angegeben wird. Einzelheiten zu Dienstvorgängen finden Sie unter OperationContractAttribute.
Standardmäßig sind die Name-Eigenschaft und die Namespace-Eigenschaft der Name des Vertragstyps bzw. http://tempuri.org
, und ProtectionLevel ist ProtectionLevel.None. Es wird empfohlen, dass Dienstverträge ihre Namen, Namespaces und Schutzebenen explizit mit diesen Eigenschaften festlegen. Dadurch können zwei Ziele erreicht werden. Erstens wird dabei ein Vertrag erstellt, der nicht direkt mit den Informationen zum verwalteten Typ verbunden ist und es Ihnen dadurch ermöglicht, Ihren verwalteten Code und Ihre verwalteten Namespaces umzugestalten, ohne den in WSDL angegebenen Vertrag zu brechen. Zweitens wird der Laufzeit durch die explizite Anforderung einer bestimmten Schutzebene beim Vertrag selbst ermöglicht zu prüfen, ob die Bindungskonfiguration diese Sicherheitsebene unterstützt, wodurch verhindert wird, dass durch eine unzureichende Konfiguration vertrauliche Informationen weitergegeben werden. Weitere Informationen zu Schutzstufen finden Sie unter "Grundlegendes zur Schutzstufe".
Um einen Dienst für die Verwendung von Clientanwendungen verfügbar zu machen, erstellen Sie eine Hostanwendung, um Ihren Dienstendpunkt mit Windows Communication Foundation (WCF) zu registrieren. Sie können WCF-Dienste mithilfe Windows Aktivierungsdienste (WAS) in Konsolenanwendungen, Windows Dienstanwendungen, ASP.NET Anwendungen, Windows Forms Anwendungen oder einer anderen Art von Anwendungsdomäne hosten.
Das Hosten in WAS ähnelt stark dem Erstellen einer ASP.NET-Anwendung. Ausführliche Informationen finden Sie unter How to: Host a WCF Service in IIS.
Clients verwenden entweder die Dienstvertragsschnittstelle (die mit ServiceContractAttribute markierte Schnittstelle), um einen Kanal für den Dienst zu erstellen, oder sie verwenden die Clientobjekte (die die Typinformationen der Dienstvertragsschnittstelle mit der ClientBase<TChannel>-Klasse kombinieren), um mit dem Dienst zu kommunizieren. Details zu Clientkanälen zu Diensten finden Sie in der Übersicht über die Klasse und den ChannelFactory<TChannel> WCF-Client.
Durch Verwendung einer ServiceContractAttribute-Klasse oder -Schnittstelle zum Erben von einer anderen ServiceContractAttribute-Klasse oder -Schnittstelle wird der übergeordnete Vertrag erweitert. Wenn z. B. eine IChildContract
-Schnittstelle mit ServiceContractAttribute markiert ist und von der Dienstvertragsschnittstelle IParentContract
erbt, enthält der IChildContract
-Dienstvertrag die Methoden von IParentContract
und IChildContract
. Das Erweitern von Verträgen (ob für Klassen oder Schnittstellen) ähnelt stark dem Erweitern verwalteter Klassen und Schnittstellen.
Die flexibelste Herangehensweise an das Erstellen von Diensten ist die Definition von Dienstvertragsschnittstellen und die anschließende Implementierung dieser Schnittstellen durch die Dienstklasse. (Dies ist auch die einfachste Möglichkeit, Ihre Dienste zu erstellen, wenn Sie Dienstverträge implementieren müssen, die von anderen definiert wurden.) Gebäudedienste direkt, indem sie eine Klasse mit und ihren Methoden OperationContractAttribute mit ServiceContractAttribute Arbeiten markieren, wenn der Dienst nur einen Vertrag verfügbar macht (aber dieser Vertrag kann von mehreren Endpunkten verfügbar gemacht werden).
Verwenden Sie die CallbackContract Eigenschaft, um einen anderen Dienstvertrag anzugeben, der, wenn sie zusammen mit dem ursprünglichen Dienstvertrag gebunden ist, einen Nachrichtenaustausch definieren, der auf zwei Arten unabhängig ablaufen kann. Ausführliche Informationen finden Sie unter CallbackContract.
Konstruktoren
ServiceContractAttribute() |
Initialisiert eine neue Instanz der ServiceContractAttribute-Klasse. |
Eigenschaften
CallbackContract |
Ruft den Typ des Rückrufvertrags ab oder legt ihn fest, wenn es sich beim Vertrag um einen Duplexvertrag handelt. |
ConfigurationName |
Ruft den Namen ab, mit dem der Dienst in einer Anwendungskonfigurationsdatei gesucht wird, oder legt ihn fest. |
HasProtectionLevel |
Ruft einen Wert ab, der angibt, ob dem Member eine Schutzebene zugewiesen wurde. |
Name |
Ruft den Namen für das |
Namespace |
Ruft den Namespace des |
ProtectionLevel |
Gibt an, ob die Bindung für den Vertrag den Wert der ProtectionLevel-Eigenschaft unterstützen muss. |
SessionMode |
Ruft ab, ob Sitzungen zugelassen, nicht zugelassen oder erforderlich sind, oder legt dies fest. |
TypeId |
Ruft bei Implementierung in einer abgeleiteten Klasse einen eindeutigen Bezeichner für dieses Attribute ab. (Geerbt von Attribute) |
Methoden
Equals(Object) |
Gibt einen Wert zurück, der angibt, ob diese Instanz gleich einem angegebenen Objekt ist. (Geerbt von Attribute) |
GetHashCode() |
Gibt den Hashcode für diese Instanz zurück. (Geerbt von Attribute) |
GetType() |
Ruft den Type der aktuellen Instanz ab. (Geerbt von Object) |
IsDefaultAttribute() |
Gibt beim Überschreiben in einer abgeleiteten Klasse an, ob der Wert der Instanz der Standardwert für die abgeleitete Klasse ist. (Geerbt von Attribute) |
Match(Object) |
Beim Überschreiben in einer abgeleiteten Klasse wird ein Wert zurückgegeben, der angibt, ob diese Instanz einem bestimmten Objekt entspricht. (Geerbt von Attribute) |
MemberwiseClone() |
Erstellt eine flache Kopie des aktuellen Object. (Geerbt von Object) |
ToString() |
Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Geerbt von Object) |
Explizite Schnittstellenimplementierungen
_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Ordnet eine Reihe von Namen einer entsprechenden Reihe von Dispatchbezeichnern zu. (Geerbt von Attribute) |
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
Ruft die Typinformationen für ein Objekt ab, mit deren Hilfe die Typinformationen für eine Schnittstelle abgerufen werden können. (Geerbt von Attribute) |
_Attribute.GetTypeInfoCount(UInt32) |
Ruft die Anzahl der Schnittstellen mit Typinformationen ab, die von einem Objekt bereitgestellt werden (0 oder 1). (Geerbt von Attribute) |
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Stellt den Zugriff auf von einem Objekt verfügbar gemachte Eigenschaften und Methoden bereit. (Geerbt von Attribute) |