Freigeben über


ServiceContractAttribute Klasse

Definition

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
ServiceContractAttribute
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 IParentContracterbt, 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 <portType>-Element in Web Services Description Language (WSDL) ab oder legt ihn fest.

Namespace

Ruft den Namespace des <portType>-Elements in der Web Services Description Language (WSDL) ab oder legt ihn fest.

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)

Gilt für

Siehe auch