ServiceContractAttribute Klasa

Definicja

Wskazuje, że interfejs lub klasa definiuje kontrakt usługi w aplikacji Windows Communication Foundation (WCF).

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
Dziedziczenie
ServiceContractAttribute
Atrybuty

Przykłady

Poniższy przykład kodu pokazuje, jak zastosować ServiceContractAttribute element do interfejsu w celu zdefiniowania kontraktu usługi za pomocą jednej metody usługi wskazanej przez metodę OperationContractAttribute. W tym przypadku poziom ochrony wymagany przez powiązania dla wszystkich komunikatów to ProtectionLevel.EncryptAndSign.

Następnie przykładowy kod implementuje ten kontrakt w SampleService klasie .

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

Poniższy przykład kodu przedstawia prosty plik konfiguracji dla poprzedniej usługi, który tworzy jeden punkt końcowy.

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

Poniższy przykład kodu przedstawia prostego klienta, który wywołuje powyższy kod SampleService.

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

Uwagi

Użyj atrybutu ServiceContractAttribute w interfejsie (lub klasie), aby zdefiniować kontrakt usługi. Następnie użyj atrybutu OperationContractAttribute w co najmniej jednej metodzie klasy (lub interfejsu), aby zdefiniować operacje usługi kontraktu. Gdy kontrakt usługi jest implementowany i połączony z powiązaniami i obiektem EndpointAddress , kontrakt usługi jest udostępniany do użytku przez klientów. Aby zapoznać się z omówieniem procesu przy użyciu prostych przykładów, zobacz Wprowadzenie Samouczek. Aby uzyskać więcej informacji na temat tworzenia kontraktów usług, zobacz Projektowanie i implementowanie usług.

Informacje wyrażone przez element ServiceContractAttribute i jego interfejs są luźno powiązane z elementem WSDL (Web Services Description Language). <portType> Kontrakt usługi jest używany po stronie usługi, aby określić, co punkt końcowy usługi uwidacznia obiektom wywołującym. Jest on również używany po stronie klienta w celu określenia kontraktu punktu końcowego, z którym komunikuje się klient, a w przypadku kontraktów dwukierunkowych w celu określenia kontraktu wywołania zwrotnego (przy użyciu CallbackContract właściwości), który klient musi zaimplementować, aby uczestniczyć w konwersacji dwukierunkowej.

Uwaga

Interfejs lub klasa, która jest ozdobiona musi ServiceContractAttribute również mieć co najmniej jedną metodę oznaczoną atrybutem OperationContractAttribute , aby uwidocznić wszelkie funkcje. Zobacz sekcję Przykłady, aby zapoznać się z przykładem kodu najprostszego użycia tych dwóch atrybutów do definiowania i implementowania usługi.

ServiceContractAttribute Użyj właściwości, aby zmodyfikować kontrakt usługi.

  • Właściwość ConfigurationName określa nazwę elementu usługi w pliku konfiguracji do użycia.

  • Właściwości Name i Namespace kontrolują nazwę i przestrzeń nazw kontraktu w elemecie WSDL <portType> .

  • Właściwość SessionMode określa, czy kontrakt wymaga powiązania obsługującego sesje.

  • Właściwość CallbackContract określa kontrakt zwrotny w dwukierunkowej konwersacji (dwukierunkowej).

  • Właściwości HasProtectionLevel i ProtectionLevel wskazują, czy wszystkie komunikaty obsługujące kontrakt mają jawną ProtectionLevel wartość, a jeśli tak, to jaki jest ten poziom.

Usługi implementują kontrakty usług reprezentujące wymianę danych obsługiwane przez typ usługi. Klasa usługi może zaimplementować kontrakt usługi (przez zaimplementowanie interfejsu oznaczonego za pomocą ServiceContractAttribute , który ma metody oznaczone za pomocą OperationContractAttribute) lub może być oznaczony za pomocą ServiceContractAttribute i zastosować OperationContractAttribute atrybut do własnych metod. (Jeśli klasa implementuje interfejs oznaczony za pomocą ServiceContractAttributeelementu , nie można go oznaczyć za pomocą ServiceContractAttribute. Metody na typach usług, które są oznaczone elementem OperationContractAttribute , są traktowane jako część domyślnego kontraktu usługi określonego przez sam typ usługi. Aby uzyskać szczegółowe informacje o operacjach usługi, zobacz OperationContractAttribute.

Domyślnie Name właściwości i Namespace są nazwą typu kontraktu i http://tempuri.org, odpowiednio, i ProtectionLevel to ProtectionLevel.None. Zaleca się jawne ustawianie nazw, przestrzeni nazw i poziomów ochrony kontraktów usług przy użyciu tych właściwości. W ten sposób osiąga dwa cele. Najpierw tworzy kontrakt, który nie jest bezpośrednio połączony z informacjami o typie zarządzanym, umożliwiając refaktoryzację kodu zarządzanego i przestrzeni nazw bez przerywania kontraktu w postaci wyrażonej w języku WSDL. Po drugie, jawne wymaganie określonego poziomu ochrony na samym kontrakcie umożliwia środowisku uruchomieniowemu sprawdzenie, czy konfiguracja powiązania obsługuje ten poziom zabezpieczeń, zapobiegając ujawnieniu poufnych informacji przez słabą konfigurację. Aby uzyskać więcej informacji na temat poziomów ochrony, zobacz Omówienie poziomu ochrony.

Aby uwidocznić usługę do użycia przez aplikacje klienckie, utwórz aplikację hosta w celu zarejestrowania punktu końcowego usługi w programie Windows Communication Foundation (WCF). Usługi WCF można hostować przy użyciu usług aktywacji Windows (WAS) w aplikacjach konsolowych, aplikacjach Windows Service, aplikacjach ASP.NET, aplikacjach Windows Forms lub dowolnej innej domenie aplikacji.

Hosting w usłudze WAS jest bardzo podobny do tworzenia aplikacji ASP.NET. Aby uzyskać szczegółowe informacje, zobacz How to: Host a WCF Service in IIS (Instrukcje: hostowanie usługi WCF w usługach IIS).

Klienci używają interfejsu kontraktu usługi (interfejsu oznaczonego za pomocą ServiceContractAttribute), aby utworzyć kanał do usługi lub używają obiektów klienta (które łączą informacje o typie interfejsu kontraktu usługi z klasą) w celu komunikowania się z usługą ClientBase<TChannel> . Aby uzyskać szczegółowe informacje na temat kanałów klienta do usług, zobacz ChannelFactory<TChannel> klasa i Omówienie klienta WCF.

ServiceContractAttribute Użycie klasy lub interfejsu do dziedziczenia z innej ServiceContractAttribute klasy lub interfejsu rozszerza kontrakt nadrzędny. Jeśli na przykład IChildContract interfejs jest oznaczony i dziedziczony z ServiceContractAttribute innego interfejsu kontraktu usługi, IParentContract``IChildContract kontrakt usługi zawiera metody i IParentContract IChildContract. Rozszerzanie kontraktów (zarówno w klasach, jak i interfejsach) jest bardzo podobne do rozszerzania zarządzanych klas i interfejsów.

Najbardziej elastycznym podejściem do tworzenia usług jest najpierw zdefiniowanie interfejsów kontraktu usługi, a następnie zaimplementowanie tego interfejsu przez klasę usługi. (Jest to również najprostszy sposób tworzenia usług, jeśli musisz zaimplementować kontrakty usług zdefiniowane przez inne osoby). Tworzenie usług bezpośrednio przez oznaczenie klasy za pomocą ServiceContractAttribute metody i jej metod OperationContractAttribute działa, gdy usługa uwidacznia tylko jeden kontrakt (ale ten kontrakt może być uwidoczniony przez więcej niż jeden punkt końcowy).

CallbackContract Użyj właściwości , aby wskazać inny kontrakt usługi, który po połączeniu z oryginalnym kontraktem usługi zdefiniuj wymianę komunikatów, która może przepływać na dwa sposoby niezależnie. Aby uzyskać szczegółowe informacje, zobacz CallbackContract.

Konstruktory

ServiceContractAttribute()

Inicjuje nowe wystąpienie klasy ServiceContractAttribute.

Właściwości

CallbackContract

Pobiera lub ustawia typ kontraktu wywołania zwrotnego, gdy kontrakt jest kontraktem dupleksowym.

ConfigurationName

Pobiera lub ustawia nazwę używaną do lokalizowania usługi w pliku konfiguracji aplikacji.

HasProtectionLevel

Pobiera wartość wskazującą, czy element członkowski ma przypisany poziom ochrony.

Name

Pobiera lub ustawia nazwę <portType> elementu w języku WSDL (Web Services Description Language).

Namespace

Pobiera lub ustawia przestrzeń nazw <portType> elementu w języku WSDL (Web Services Description Language).

ProtectionLevel

Określa, czy powiązanie kontraktu musi obsługiwać wartość ProtectionLevel właściwości.

SessionMode

Pobiera lub ustawia, czy sesje są dozwolone, niedozwolone lub wymagane.

TypeId

Po zaimplementowaniu w klasie pochodnej pobiera unikatowy identyfikator dla tego Attributeelementu .

(Odziedziczone po Attribute)

Metody

Equals(Object)

Zwraca wartość wskazującą, czy to wystąpienie jest równe podanemu obiektowi.

(Odziedziczone po Attribute)
GetHashCode()

Zwraca wartość skrótu dla tego wystąpienia.

(Odziedziczone po Attribute)
GetType()

Type Pobiera wartość bieżącego wystąpienia.

(Odziedziczone po Object)
IsDefaultAttribute()

W przypadku zastąpienia w klasie pochodnej wskazuje, czy wartość tego wystąpienia jest wartością domyślną klasy pochodnej.

(Odziedziczone po Attribute)
Match(Object)

Po przesłonięciu w klasie pochodnej zwraca wartość wskazującą, czy to wystąpienie jest równe określonemu obiektowi.

(Odziedziczone po Attribute)
MemberwiseClone()

Tworzy płytkią kopię bieżącego Objectelementu .

(Odziedziczone po Object)
ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)

Jawne implementacje interfejsu

_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Zestaw nazw jest mapowany na odpowiedni zestaw identyfikatorów wysyłania.

(Odziedziczone po Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Pobiera informacje o typie dla obiektu, który może służyć do pobierania informacji o typie dla interfejsu.

(Odziedziczone po Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Pobiera informację o liczbie typów interfejsów, jakie zawiera obiekt (0 lub 1).

(Odziedziczone po Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Umożliwia dostęp do właściwości i metod udostępnianych przez obiekt.

(Odziedziczone po Attribute)

Dotyczy

Zobacz też