ServiceContractAttribute ServiceContractAttribute ServiceContractAttribute ServiceContractAttribute Class

Определение

Показывает, что интерфейс или класс определяет контракт службы в приложении Windows Communication Foundation (WCF).Indicates that an interface or a class defines a service contract in a Windows Communication Foundation (WCF) application.

public ref class ServiceContractAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, Inherited=false)]
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple=false, Inherited=false)]
public sealed class ServiceContractAttribute : Attribute
type ServiceContractAttribute = class
    inherit Attribute
Public NotInheritable Class ServiceContractAttribute
Inherits Attribute
Наследование
ServiceContractAttributeServiceContractAttributeServiceContractAttributeServiceContractAttribute
Атрибуты

Примеры

В следующем примере кода показано, как применить атрибут ServiceContractAttribute к интерфейсу, чтобы определить контракт службы с одним методом службы, указанным атрибутом OperationContractAttribute.The following code example shows how to apply the ServiceContractAttribute to an interface to define a service contract with one service method, indicated by the OperationContractAttribute. В этом случае уровень защиты, требуемый от привязок для всех сообщений, — ProtectionLevel.EncryptAndSign.In this case, the protection level required of bindings for all messages is ProtectionLevel.EncryptAndSign.

Затем в примере кода этот контракт реализуется в классе SampleService.The code example then implements that contract on the SampleService class.

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

В следующем примере кода показан простой файл конфигурации для указанной выше службы, создающей одну конечную точку.The following code example shows a simple configuration file for the preceding service that creates one endpoint.

<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.The following code example shows a simple client that invokes the preceding 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
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 в интерфейсе (или в классе).Use the ServiceContractAttribute attribute on an interface (or class) to define a service contract. Затем используйте атрибут OperationContractAttribute в одном или нескольких методах класса (или интерфейса), чтобы определить операции службы контракта.Then use the OperationContractAttribute attribute on one or more of the class (or interface) methods to define the contract's service operations. Если контракт службы реализуется и объединяется с привязки и EndpointAddress объекта, контракт службы предоставляется для использования клиентами.When the service contract is implemented and combined with a Bindings and an EndpointAddress object, the service contract is exposed for use by clients. Общие сведения о процессе и простые примеры, см. в разделе Приступая к работе.For an overview of the process using simple examples, see Getting Started Tutorial. Дополнительные сведения о создании контрактов службы, см. в разделе проектирование и реализация служб.For more information about creating service contracts, see Designing and Implementing Services.

Данные, предоставляемые классом ServiceContractAttribute и его интерфейсом, слабо связаны с элементом <portType> языка описания служб (WSDL).The information expressed by a ServiceContractAttribute and its interface is loosely related to the Web Services Description Language (WSDL) <portType> element. Контракт службы используется на стороне службы для указания конечной точки службы предоставляет вызывающим объектам.A service contract is used on the service side to specify what the service's endpoint exposes to callers. Кроме того, он используется на стороне клиента для указания контракта конечной точки, с которой взаимодействует клиент, а в случае дуплексных контрактов — для указания контракта обратного вызова (с использованием свойства CallbackContract), который должен реализовать клиент, чтобы принять участие в дуплексном диалоге.It is also used on the client side to specify the contract of the endpoint with which the client communicates and, in the case of duplex contracts, to specify the callback contract (using the CallbackContract property) that the client must implement in order to participate in a duplex conversation.

Примечание

Интерфейс или класс, отмеченный атрибутом ServiceContractAttribute, также должен иметь как минимум один метод, отмеченный атрибутом OperationContractAttribute, для предоставления всех функциональных возможностей.An interface or class that is decorated with ServiceContractAttribute must also have at least one method marked with the OperationContractAttribute attribute to expose any functionality. Пример кода простейшего использования двух атрибутов для определения и реализации службы см. в разделе "Примеры".See the Examples section for a code example of the simplest use of the two attributes to define and implement a service.

Чтобы изменить контракт службы, используйте свойства ServiceContractAttribute.Use the ServiceContractAttribute properties to modify the service contract.

  • Свойство ConfigurationName определяет имя элемента службы в используемом файле конфигурации.The ConfigurationName property specifies the name of the service element in the configuration file to use.

  • Свойства Name и Namespace управляют именем и пространством имен контракта в элементе <portType> языка WSDL.The Name and Namespace properties control the name and namespace of the contract in the WSDL <portType> element.

  • Свойство SessionMode определяет, требуется ли контракту привязка, поддерживающая сеансы.The SessionMode property specifies whether the contract requires a binding that supports sessions.

  • Свойство CallbackContract определяет возвращаемый контракт в двустороннем (дуплексном) диалоге.The CallbackContract property specifies the return contract in a two-way (duplex) conversation.

  • Свойства HasProtectionLevel и ProtectionLevel определяют, все ли сообщения, поддерживающие контракт, имеют явное значение ProtectionLevel, и если да, на каком уровне.The HasProtectionLevel and ProtectionLevel properties indicate whether all messages supporting the contract have a explicit ProtectionLevel value, and if so, what that level is.

Службы реализуют контракты служб, представляющие обмен данными, поддерживаемый типом службы.Services implement service contracts, which represent the data exchange that a service type supports. Класс службы может реализовать контракт службы (путем реализации интерфейса, отмеченного атрибутом ServiceContractAttribute, который содержит методы, отмеченные атрибутом OperationContractAttribute) или может быть отмечен атрибутом ServiceContractAttribute и применять атрибут OperationContractAttribute к собственным методам.A service class can implement a service contract (by implementing an interface marked with ServiceContractAttribute that has methods marked with OperationContractAttribute) or it can be marked with the ServiceContractAttribute and apply the OperationContractAttribute attribute to its own methods. (Если класс реализует интерфейс, отмеченный атрибутом ServiceContractAttribute, сам он не может быть отмечен атрибутом ServiceContractAttribute.) Методы в типах службы, отмеченные атрибутом OperationContractAttribute, считаются частью контракта службы по умолчанию, заданного самим типом службы.(If a class implements an interface marked with ServiceContractAttribute, it cannot be itself marked with ServiceContractAttribute.) Methods on service types that are marked with the OperationContractAttribute are treated as part of a default service contract specified by the service type itself. Подробные сведения об операциях службы см. в разделе OperationContractAttribute.For details about service operations, see OperationContractAttribute.

По умолчанию свойства Name и Namespace являются именем типа контракта и http://tempuri.org соответственно, а уровень ProtectionLevel является уровнем ProtectionLevel.None.By default, the Name and Namespace properties are the name of the contract type and http://tempuri.org, respectively, and ProtectionLevel is ProtectionLevel.None. Рекомендуется, чтобы контракты службы явным образом задавали свои имена, пространства имен и уровни защиты с использованием этих свойств.It is recommended that service contracts explicitly set their names, namespaces, and protection levels using these properties. Это помогает достичь двух целей.Doing so accomplishes two goals. Во-первых, создается контракт, не связанный напрямую со сведениями об управляемых типах, что позволяет выполнить рефакторинг управляемого кода и пространств имен без нарушения контракта, поскольку он выражен на языке WSDL.First, it builds a contract that is not directly connected to the managed type information, enabling you to refactor your managed code and namespaces without breaking the contract as it is expressed in WSDL. Во-вторых, явная необходимость в определенном уровне защиты самого контракта позволяет среде выполнения проверять, поддерживает ли конфигурация привязки этот уровень безопасности, не допуская раскрытия конфиденциальных сведений неудовлетворительной конфигурацией.Second, explicitly requiring a certain level of protection on the contract itself enables the runtime to validate whether the binding configuration supports that level of security, preventing poor configuration from exposing sensitive information. Дополнительные сведения об уровнях защиты см. в разделе уровень защиты понимание.For more information about protection levels, see Understanding Protection Level.

Чтобы предоставить службу для использования клиентскими приложениями, создайте ведущее приложение для регистрации конечной точки службы с помощью Windows Communication Foundation (WCF).To expose a service for use by client applications, create a host application to register your service endpoint with Windows Communication Foundation (WCF). Вы можете размещать службы WCF, с помощью службы активации Windows (WAS), консольные приложения, приложения служб Windows, приложений ASP.NET, приложения Windows Forms или любого другого домена приложения.You can host WCF services using Windows Activation Services (WAS), in console applications, Windows Service applications, ASP.NET applications, Windows Forms applications, or any other kind of application domain.

Размещение в WAS очень похоже на создание приложения ASP.NET.Hosting in the WAS is very similar to creating an ASP.NET application. Подробную информацию см. в разделе Практическое руководство. Размещение службы WCF в IIS.For details, see How to: Host a WCF Service in IIS.

Клиенты либо используют интерфейс контракта службы (интерфейс, отмеченный атрибутом ServiceContractAttribute) для создания канала к службе, либо используют объекты клиента (которые объединяют сведения о типе интерфейса контракта службы с классом ClientBase<TChannel>) для взаимодействия со службой.Clients either use the service contract interface (the interface marked with ServiceContractAttribute) to create a channel to the service or they use the client objects (which combine the type information of the service contract interface with the ClientBase<TChannel> class) to communicate with your service. Дополнительные сведения о клиентских каналах к службам, см. в разделе ChannelFactory<TChannel> класс и WCF Client Overview.For details on client channels to services, see the ChannelFactory<TChannel> class and WCF Client Overview.

При использовании класса или интерфейса ServiceContractAttribute для наследования от другого класса или интерфейса ServiceContractAttribute расширяется родительский контракт.Using a ServiceContractAttribute class or interface to inherit from another ServiceContractAttribute class or interface extends the parent contract. Например, если интерфейс IChildContract отмечен атрибутом ServiceContractAttribute и унаследован от другого интерфейса контракта службы, IParentContract, контракт службы IChildContract содержит методы как IParentContract, так и IChildContract.For example, if an IChildContract interface is marked with ServiceContractAttribute and inherited from another service contract interface, IParentContract, the IChildContract service contract contains the methods of both IParentContract and IChildContract. Расширение контрактов (как в классах, так и в интерфейсах) очень похоже на расширение управляемых классов и интерфейсов.Extending contracts (whether on classes or interfaces) is very similar to extending managed classes and interfaces.

Самым гибким подходом к созданию служб является первоначальное определение интерфейсов контрактов службы и последующая реализация этого интерфейса классом службы.The most flexible approach to creating services is to define service contract interfaces first and then have your service class implement that interface. (Это также самый простой способ создать службы, если необходимо реализовать контракты службы, определенные другими пользователями.) Создавать службы напрямую, отметив класс атрибутом ServiceContractAttribute, а его методы — атрибутом OperationContractAttribute, можно, если служба предоставляет только один контракт (но этот контракт может быть предоставлен несколькими конечными точками).(This is also the simplest way to build your services if you must implement service contracts that have been defined by others.) Building services directly by marking a class with ServiceContractAttribute and its methods with OperationContractAttribute works when the service exposes only one contract (but that contract can be exposed by more than one endpoint).

Используйте CallbackContract свойство, чтобы указать другой контракт службы, который, будучи связанным с исходным контрактом службы, определяет обмен сообщениями, который может осуществляться в обе стороны независимо друг от друга.Use the CallbackContract property to indicate another service contract that, when bound together with the original service contract, define a message exchange that can flow in two ways independently. Дополнительные сведения см. в разделе CallbackContract.For details, see CallbackContract.

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

ServiceContractAttribute() ServiceContractAttribute() ServiceContractAttribute() ServiceContractAttribute()

Инициализирует новый экземпляр класса ServiceContractAttribute.Initializes a new instance of the ServiceContractAttribute class.

Свойства

CallbackContract CallbackContract CallbackContract CallbackContract

Возвращает или задает тип контракта обратного вызова, если контракт является дуплексным.Gets or sets the type of callback contract when the contract is a duplex contract.

ConfigurationName ConfigurationName ConfigurationName ConfigurationName

Возвращает или задает имя, используемое для поиска службы в файле конфигурации приложения.Gets or sets the name used to locate the service in an application configuration file.

HasProtectionLevel HasProtectionLevel HasProtectionLevel HasProtectionLevel

Возвращает значение, указывающее, присвоен ли участнику уровень защиты.Gets a value that indicates whether the member has a protection level assigned.

Name Name Name Name

Возвращает или задает имя элемента <portType> в языке WSDL.Gets or sets the name for the <portType> element in Web Services Description Language (WSDL).

Namespace Namespace Namespace Namespace

Возвращает или задает пространство имен элемента <portType> в языке WSDL.Gets or sets the namespace of the <portType> element in Web Services Description Language (WSDL).

ProtectionLevel ProtectionLevel ProtectionLevel ProtectionLevel

Указывает, должна ли привязка для контракта поддерживать значение свойства ProtectionLevel.Specifies whether the binding for the contract must support the value of the ProtectionLevel property.

SessionMode SessionMode SessionMode SessionMode

Возвращает или задает значение, указывающее, разрешены, запрещены или требуются ли сеансы.Gets or sets whether sessions are allowed, not allowed or required.

TypeId TypeId TypeId TypeId

При реализации в производном классе возвращает уникальный идентификатор для этого Attribute.When implemented in a derived class, gets a unique identifier for this Attribute.

(Inherited from Attribute)

Методы

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Возвращает значение, указывающее, равен ли этот экземпляр указанному объекту.Returns a value that indicates whether this instance is equal to a specified object.

(Inherited from Attribute)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Возвращает хэш-код для данного экземпляра.Returns the hash code for this instance.

(Inherited from Attribute)
GetType() GetType() GetType() GetType()

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

(Inherited from Object)
IsDefaultAttribute() IsDefaultAttribute() IsDefaultAttribute() IsDefaultAttribute()

При переопределении в производном классе показывает, является ли значение данного экземпляра значением по умолчанию для производного класса.When overridden in a derived class, indicates whether the value of this instance is the default value for the derived class.

(Inherited from Attribute)
Match(Object) Match(Object) Match(Object) Match(Object)

При переопределении в производном классе возвращает значение, указывающее, является ли этот экземпляр равным заданному объекту.When overridden in a derived class, returns a value that indicates whether this instance equals a specified object.

(Inherited from Attribute)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

Возвращает строку, представляющую текущий объект.Returns a string that represents the current object.

(Inherited from Object)

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

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

Сопоставляет набор имен соответствующему набору идентификаторов диспетчеризации.Maps a set of names to a corresponding set of dispatch identifiers.

(Inherited from Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Возвращает сведения о типе объекта, которые могут использоваться для получения сведений о типе интерфейса.Retrieves the type information for an object, which can be used to get the type information for an interface.

(Inherited from Attribute)
_Attribute.GetTypeInfoCount(UInt32) _Attribute.GetTypeInfoCount(UInt32) _Attribute.GetTypeInfoCount(UInt32) _Attribute.GetTypeInfoCount(UInt32)

Возвращает количество предоставляемых объектом интерфейсов для доступа к сведениям о типе (0 или 1).Retrieves the number of type information interfaces that an object provides (either 0 or 1).

(Inherited from Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Предоставляет доступ к открытым свойствам и методам объекта.Provides access to properties and methods exposed by an object.

(Inherited from Attribute)

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

Дополнительно