Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В примере Duplex показано, как определить и реализовать дуплексный контракт. Дуплексное взаимодействие возникает, когда клиент устанавливает сеанс со службой и предоставляет службе канал, на котором служба может отправлять сообщения обратно клиенту. Этот пример основан на Кратком руководстве. Дуплексный контракт определяется как пара интерфейсов — основной интерфейс от клиента к службе и интерфейс обратного вызова из службы клиенту. В этом примере ICalculatorDuplex интерфейс позволяет клиенту выполнять математические операции, вычисляя результат по сеансу. Служба возвращает результаты через интерфейс ICalculatorDuplexCallback. Для дуплексного контракта требуется сеанс, поскольку необходимо установить контекст для корреляции набора сообщений, передаваемых между клиентом и службой.
Замечание
Процедура установки и инструкции по сборке для этого примера находятся в конце этого раздела.
В этом примере клиентом является консольное приложение (.exe), а служба хостится с помощью Internet Information Services (IIS). Дуплексный контракт определяется следующим образом:
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required,
CallbackContract=typeof(ICalculatorDuplexCallback))]
public interface ICalculatorDuplex
{
[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);
}
public interface ICalculatorDuplexCallback
{
[OperationContract(IsOneWay = true)]
void Result(double result);
[OperationContract(IsOneWay = true)]
void Equation(string eqn);
}
Класс CalculatorService реализует первичный ICalculatorDuplex интерфейс. Служба использует режим экземпляра PerSession для сохранения результата для каждого сеанса. Имя частного свойства Callback используется для доступа к каналу обратного вызова клиенту. Служба использует обратный вызов для отправки сообщений клиенту через интерфейс обратного вызова.
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class CalculatorService : ICalculatorDuplex
{
double result = 0.0D;
string equation;
public CalculatorService()
{
equation = result.ToString();
}
public void Clear()
{
Callback.Equation($"{equation} = {result}");
equation = result.ToString();
}
public void AddTo(double n)
{
result += n;
equation += $" + {n}";
Callback.Result(result);
}
//...
ICalculatorDuplexCallback Callback
{
get
{
return OperationContext.Current.GetCallbackChannel<ICalculatorDuplexCallback>();
}
}
}
Клиент должен предоставить класс, реализующий интерфейс обратного вызова дуплексного контракта для получения сообщений от службы. В примере CallbackHandler класс определен для реализации ICalculatorDuplexCallback интерфейса.
public class CallbackHandler : ICalculatorDuplexCallback
{
public void Result(double result)
{
Console.WriteLine("Result({0})", result);
}
public void Equation(string equation)
{
Console.WriteLine("Equation({0}", equation);
}
}
Прокси-сервер, созданный для дуплексного контракта, требует InstanceContext при создании. Это InstanceContext используется как место для объекта, который реализует интерфейс обратного вызова и обрабатывает сообщения, отправляемые обратно из службы. Объект InstanceContext создается с экземпляром CallbackHandler класса. Этот объект обрабатывает сообщения, отправленные из службы клиенту в интерфейс обратного вызова.
// Construct InstanceContext to handle messages on callback interface.
InstanceContext instanceContext = new InstanceContext(new CallbackHandler());
// Create a client.
CalculatorDuplexClient client = new CalculatorDuplexClient(instanceContext);
Console.WriteLine("Press <ENTER> to terminate client once the output is displayed.");
Console.WriteLine();
// Call the AddTo service operation.
double value = 100.00D;
client.AddTo(value);
// Call the SubtractFrom service operation.
value = 50.00D;
client.SubtractFrom(value);
// Call the MultiplyBy service operation.
value = 17.65D;
client.MultiplyBy(value);
// Call the DivideBy service operation.
value = 2.00D;
client.DivideBy(value);
// Complete equation.
client.Clear();
Console.ReadLine();
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();
Конфигурация была изменена, чтобы предоставить привязку, поддерживающую сеансовую и дуплексную связь. Поддержка wsDualHttpBinding взаимодействия в сеансе и обеспечение двухсторонней связи путем предоставления двух HTTP-подключений, по одному для каждого направления. В службе единственное различие в конфигурации — это используемая привязка. На клиенте необходимо настроить адрес, который сервер может использовать для подключения к клиенту, как показано в следующем примере конфигурации.
<client>
<endpoint name=""
address="http://localhost/servicemodelsamples/service.svc"
binding="wsDualHttpBinding"
bindingConfiguration="DuplexBinding"
contract="Microsoft.ServiceModel.Samples.ICalculatorDuplex" />
</client>
<bindings>
<!-- Configure a binding that support duplex communication. -->
<wsDualHttpBinding>
<binding name="DuplexBinding"
clientBaseAddress="http://localhost:8000/myClient/">
</binding>
</wsDualHttpBinding>
</bindings>
При запуске примера отображаются сообщения, которые возвращаются клиенту через интерфейс обратного вызова, отправляемый службой. Каждый промежуточный результат отображается, за которым следует все уравнение после завершения всех операций. Нажмите клавишу ВВОД, чтобы выключить клиента.
Настройка, сборка и запуск примера
Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.
Чтобы создать версии решения C#, C++, или Visual Basic .NET, выполните инструкции по созданию примеров Windows Communication Foundation.
Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в запуска примеров Windows Communication Foundation.
Это важно
При запуске клиента в конфигурации между компьютерами обязательно замените localhost в
addressатрибуте <конечной точки> клиентского <> элемента иclientBaseAddressатрибуте <элемента привязки>элемента wsDualHttpBinding< именем соответствующего компьютера, как показано в следующем примере:><client> <endpoint name = "" address="http://service_machine_name/servicemodelsamples/service.svc" ... /> </client> ... <wsDualHttpBinding> <binding name="DuplexBinding" clientBaseAddress="http://client_machine_name:8000/myClient/"> </binding> </wsDualHttpBinding>