Поделиться через


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, AllowMultiple=false, 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 , слабо связана с элементом языка описания веб-служб (WSDL <portType> ). Контракт службы используется на стороне службы, чтобы указать, какую конечную точку службы предоставляет вызывающим службам. Он также используется на стороне клиента, чтобы указать контракт конечной точки, с которой клиент взаимодействует, и, в случае дуплексных контрактов, чтобы указать контракт обратного вызова (с помощью CallbackContract свойства), который клиент должен реализовать для участия в дуплексном диалоге.

Замечание

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

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

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

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

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

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

  • ProtectionLevel Свойства HasProtectionLevel указывают, имеют ли все сообщения, поддерживающие контракт, явное 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 и наследуется от другого интерфейса контракта службы, IParentContractIChildContract контракт службы содержит методы обоих 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)

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

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