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 интерфейс к интерфейсу для определения контракта службы с одним методом службы, указанным параметром 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 |
Возвращает или задает имя |
| Namespace |
Возвращает или задает пространство |
| 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) |