ServiceContractAttribute Класс

Определение

Показывает, что интерфейс или класс определяет контракт службы в приложении 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
Наследование
ServiceContractAttribute
Атрибуты

Примеры

В следующем примере кода показано, как применить атрибут ServiceContractAttribute к интерфейсу, чтобы определить контракт службы с одним методом службы, указанным атрибутом OperationContractAttribute. В этом случае уровень защиты, требуемый от привязок для всех сообщений, — ProtectionLevel.EncryptAndSign.

Затем в примере кода этот контракт реализуется в классе SampleService.

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

В следующем примере кода показан простой файл конфигурации для указанной выше службы, создающей одну конечную точку.

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

В следующем примере кода показан простой клиент, вызывающий приведенный выше класс 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

Комментарии

Чтобы определить контракт службы, используйте атрибут ServiceContractAttribute в интерфейсе (или в классе). Затем используйте атрибут OperationContractAttribute в одном или нескольких методах класса (или интерфейса), чтобы определить операции службы контракта. Когда контракт службы реализуется и сочетается с привязками и EndpointAddress объектом, контракт службы предоставляется для использования клиентами. Общие сведения о процессе с использованием простых примеров см. в начало работы руководстве. Дополнительные сведения о создании контрактов служб см. в разделе "Проектирование и реализация служб".

Данные, предоставляемые классом ServiceContractAttribute и его интерфейсом, слабо связаны с элементом <portType> языка описания служб (WSDL). Контракт службы используется на стороне службы, чтобы указать, что конечная точка службы предоставляет вызывающим абонентам. Кроме того, он используется на стороне клиента для указания контракта конечной точки, с которой взаимодействует клиент, а в случае дуплексных контрактов — для указания контракта обратного вызова (с использованием свойства CallbackContract), который должен реализовать клиент, чтобы принять участие в дуплексном диалоге.

Примечание

Интерфейс или класс, отмеченный атрибутом ServiceContractAttribute, также должен иметь как минимум один метод, отмеченный атрибутом OperationContractAttribute, для предоставления всех функциональных возможностей. Пример кода простейшего использования двух атрибутов для определения и реализации службы см. в разделе "Примеры".

Чтобы изменить контракт службы, используйте свойства ServiceContractAttribute.

  • Свойство ConfigurationName определяет имя элемента службы в используемом файле конфигурации.

  • Свойства Name и Namespace управляют именем и пространством имен контракта в элементе <portType> языка WSDL.

  • Свойство SessionMode определяет, требуется ли контракту привязка, поддерживающая сеансы.

  • Свойство CallbackContract определяет возвращаемый контракт в двустороннем (дуплексном) диалоге.

  • Свойства HasProtectionLevel и ProtectionLevel определяют, все ли сообщения, поддерживающие контракт, имеют явное значение ProtectionLevel, и если да, на каком уровне.

Службы реализуют контракты служб, представляющие обмен данными, поддерживаемый типом службы. Класс службы может реализовать контракт службы (путем реализации интерфейса, отмеченного атрибутом ServiceContractAttribute, который содержит методы, отмеченные атрибутом OperationContractAttribute) или может быть отмечен атрибутом ServiceContractAttribute и применять атрибут OperationContractAttribute к собственным методам. (Если класс реализует интерфейс, ServiceContractAttributeпомеченный знаком, он не может быть помечен как ServiceContractAttribute.) Методы типов служб, помеченных с помощью атрибута OperationContractAttribute , обрабатываются как часть контракта службы по умолчанию, указанного самим типом службы. Подробные сведения об операциях службы см. в разделе OperationContractAttribute.

По умолчанию свойства Name и Namespace являются именем типа контракта и http://tempuri.org соответственно, а уровень ProtectionLevel является уровнем ProtectionLevel.None. Рекомендуется, чтобы контракты службы явным образом задавали свои имена, пространства имен и уровни защиты с использованием этих свойств. Это помогает достичь двух целей. Во-первых, создается контракт, не связанный напрямую со сведениями об управляемых типах, что позволяет выполнить рефакторинг управляемого кода и пространств имен без нарушения контракта, поскольку он выражен на языке WSDL. Во-вторых, явная необходимость в определенном уровне защиты самого контракта позволяет среде выполнения проверять, поддерживает ли конфигурация привязки этот уровень безопасности, не допуская раскрытия конфиденциальных сведений неудовлетворительной конфигурацией. Дополнительные сведения об уровнях защиты см. в разделе "Основные сведения об уровне защиты".

Чтобы предоставить службу для использования клиентскими приложениями, создайте ведущее приложение для регистрации конечной точки службы в Windows Communication Foundation (WCF). Службы WCF можно размещать с помощью служб активации Windows (WAS), в консольных приложениях, приложениях службы Windows, ASP.NET приложениях, Windows Forms приложениях или любом другом домене приложения.

Размещение в WAS очень похоже на создание приложения ASP.NET. Дополнительные сведения см. в разделе "Практическое руководство. Размещение службы WCF в IIS".

Клиенты либо используют интерфейс контракта службы (интерфейс, отмеченный атрибутом ServiceContractAttribute) для создания канала к службе, либо используют объекты клиента (которые объединяют сведения о типе интерфейса контракта службы с классом ClientBase<TChannel>) для взаимодействия со службой. Дополнительные сведения о клиентских каналах к службам см. в обзоре ChannelFactory<TChannel> класса и клиента WCF.

При использовании класса или интерфейса ServiceContractAttribute для наследования от другого класса или интерфейса ServiceContractAttribute расширяется родительский контракт. Например, если интерфейс IChildContract отмечен атрибутом ServiceContractAttribute и унаследован от другого интерфейса контракта службы, IParentContract, контракт службы IChildContract содержит методы как IParentContract, так и IChildContract. Расширение контрактов (как в классах, так и в интерфейсах) очень похоже на расширение управляемых классов и интерфейсов.

Самым гибким подходом к созданию служб является первоначальное определение интерфейсов контрактов службы и последующая реализация этого интерфейса классом службы. (Это также самый простой способ создания служб, если необходимо реализовать контракты служб, определенные другими пользователями.) Создание служб напрямую путем маркировки класса с ServiceContractAttribute помощью методов и его методов, OperationContractAttribute когда служба предоставляет только один контракт (но этот контракт может быть предоставлен несколькими конечными точками).

CallbackContract Используйте свойство, чтобы указать другой контракт службы, который при привязке к исходному контракту службы определяет обмен сообщениями двумя способами независимо друг от друга. Дополнительные сведения см. в разделе CallbackContract.

Конструкторы

ServiceContractAttribute()

Инициализирует новый экземпляр класса ServiceContractAttribute.

Свойства

CallbackContract

Возвращает или задает тип контракта обратного вызова, если контракт является дуплексным.

ConfigurationName

Возвращает или задает имя, используемое для поиска службы в файле конфигурации приложения.

HasProtectionLevel

Возвращает значение, указывающее, присвоен ли участнику уровень защиты.

Name

Возвращает или задает имя элемента <portType> в языке WSDL.

Namespace

Возвращает или задает пространство имен элемента <portType> в языке WSDL.

ProtectionLevel

Указывает, должна ли привязка для контракта поддерживать значение свойства ProtectionLevel.

SessionMode

Возвращает или задает значение, указывающее, разрешены, запрещены или требуются ли сеансы.

TypeId

В случае реализации в производном классе возвращает уникальный идентификатор для этого атрибута Attribute.

(Унаследовано от Attribute)

Методы

Equals(Object)

Возвращает значение, показывающее, равен ли экземпляр указанному объекту.

(Унаследовано от Attribute)
GetHashCode()

Возвращает хэш-код данного экземпляра.

(Унаследовано от Attribute)
GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
IsDefaultAttribute()

При переопределении в производном классе указывает, является ли значение этого экземпляра значением по умолчанию для производного класса.

(Унаследовано от Attribute)
Match(Object)

При переопределении в производном классе возвращает значение, указывающее, является ли этот экземпляр равным заданному объекту.

(Унаследовано от Attribute)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Явные реализации интерфейса

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

Сопоставляет набор имен соответствующему набору идентификаторов диспетчеризации.

(Унаследовано от Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Возвращает сведения о типе объекта, которые можно использовать для получения сведений о типе интерфейса.

(Унаследовано от Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Возвращает количество предоставляемых объектом интерфейсов для доступа к сведениям о типе (0 или 1).

(Унаследовано от Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Предоставляет доступ к открытым свойствам и методам объекта.

(Унаследовано от Attribute)

Применяется к

См. также раздел