Практическое руководство. Создание одностороннего контракта
В этом разделе приведены основные этапы создания методов, использующих односторонние контракты. Такие методы вызывают операции в службе Windows Communication Foundation (WCF) от клиента, но не ожидают ответа. Контракты этого типа можно использовать, к примеру, для публикации уведомлений для большого количества подписчиков. Также можно использовать односторонние контракты при создании дуплексного (двустороннего) контракта, что позволяет клиентам и серверам взаимодействовать независимо (клиент может инициировать вызовы сервера, а сервер - вызовы клиента). В частности, это позволяет серверу выполнять односторонние вызовы клиента, которые клиент может воспринимать как события. Подробные сведения об указании односторонних методов см. в описаниях свойства IsOneWay и класса OperationContractAttribute.
Дополнительные сведения о создании клиентского приложения для дуплексного контракта см. в статье "How to: службы Access with One-Way and Request-Reply Contracts". Рабочий пример см. в примере one-Way .
Создание одностороннего контракта
Создайте контракт службы, применив класс ServiceContractAttribute к интерфейсу, определяющему реализуемые службой методы.
Укажите, какие именно методы интерфейса может вызвать клиент, применив к ним класс OperationContractAttribute.
Отметьте операции, не имеющие выходных данных (возвращаемого значения и параметров out и ref), как односторонние, присвоив свойству IsOneWay значение
true
. Обратите внимание, что все операции с классом OperationContractAttribute по умолчанию соответствуют требованиям контракта типа запрос-ответ, поскольку свойство IsOneWay по умолчанию имеет значениеfalse
. Поэтому необходимо явно задать свойству атрибута значениеtrue
, если требуется использовать односторонний контракт для метода.
Пример
В следующем примере кода определяется контракт для службы, включающей несколько односторонних методов. Все методы имеют односторонние контракты, за исключением метода Equals
, по умолчанию имеющего контракт типа запрос-ответ и возвращающего результат.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
[OperationContract(IsOneWay=true)]
void Clear();
[OperationContract(IsOneWay = true)]
void AddTo(double n);
[OperationContract(IsOneWay = true)]
void SubtractFrom(double n);
[OperationContract(IsOneWay = true)]
void MultiplyBy(double n);
[OperationContract(IsOneWay = true)]
void DivideBy(double n);
[OperationContract]
double Equals();
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples", SessionMode:=SessionMode.Required)> _
Public Interface ICalculatorSession
<OperationContract(IsOneWay:=True)> _
Sub Clear()
<OperationContract(IsOneWay:=True)> _
Sub AddTo(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub SubtractFrom(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub MultiplyBy(ByVal n As Double)
<OperationContract(IsOneWay:=True)> _
Sub DivideBy(ByVal n As Double)
<OperationContract()> _
Function Equal() As Double
End Interface