Практическое руководство. Создание одностороннего контракта

В этом разделе приведены основные этапы создания методов, использующих односторонние контракты. Такие методы вызывают операции в службе Windows Communication Foundation (WCF) от клиента, но не ожидают ответа. Контракты этого типа можно использовать, к примеру, для публикации уведомлений для большого количества подписчиков. Также можно использовать односторонние контракты при создании дуплексного (двустороннего) контракта, что позволяет клиентам и серверам взаимодействовать независимо (клиент может инициировать вызовы сервера, а сервер - вызовы клиента). В частности, это позволяет серверу выполнять односторонние вызовы клиента, которые клиент может воспринимать как события. Подробные сведения об указании односторонних методов см. в описаниях свойства IsOneWay и класса OperationContractAttribute.

Дополнительные сведения о создании клиентского приложения для дуплексного контракта см. в статье "How to: службы Access with One-Way and Request-Reply Contracts". Рабочий пример см. в примере one-Way .

Создание одностороннего контракта

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

  2. Укажите, какие именно методы интерфейса может вызвать клиент, применив к ним класс OperationContractAttribute.

  3. Отметьте операции, не имеющие выходных данных (возвращаемого значения и параметров 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

См. также