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