2015-09-16 2 views
1

Я читал и экспериментировал с WCF и пытался понять работу в простых выражениях. Поэтому мои вопросы касаются проверки и проверки того, что, по моему мнению, является правильным, но я должен быть уверен: В типичной службе двусторонней печати публикации.Понимание WCF IsOneWay, CalbackContracts and Duplex - Являются ли мои предположения правильными?

1: Сервисный договор - это путь связи, который клиенты должны выполнить для обслуживания.

2: Договор обратного вызова - это способы связи с клиентом.

3: Установка свойства IsOneWay = true по контракту обратного вызова означает, что Клиент не получит ничего от сервера.

4: установка IsOneWay = true на ServiceContract означает, что сервер не получит ничего от клиента.

5: методы возврата void по-прежнему отправляют ответ обратно, если IsOneWay = true, ответ игнорируется, если можно получить ложную ошибку и информацию о мыле. ^

для краткости я посмотрел на следующее и некоторые^ⁿ:

Understanding WCF

WCF issue with using IsOneWay attribute

Understanding WCF Client to Server

https://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontractattribute.isoneway(v=vs.110).aspx

ответ

2

Посмотрите на this tutorial для WCF , и это MSDN Article на дуплексных услугах.

Вы почти там с определениями, я определил бы выше себя, как:

Договора обслуживания - интерфейс, который определяет операцию веб-служба предоставляет клиент.

Callback Contract - Как и договор обслуживания, но, как вы заметили, для клиентской стороны. Это определяет, как веб-служба может связываться с клиентом в виде отдельного вызова. (В отличие от простого возврата данных из вызовов в контракте на обслуживание). Они часто используются для возврата значений из долговременных вызовов веб-сервисов или сигнализации событий.

IsOneWay = true по контракту на обслуживание - это означает, что операция обслуживания не возвращает значения, и, следовательно, клиент просто «запустит и забудет». Вызов веб-службы не будет блокировать клиента до его завершения, а вместо этого немедленно вернуться. По этой причине операции с IsOneWay = true могут возвращать только пустоту.

IsOneWay = true по договору обратного вызова - это почти то же самое, что и в контракте на обслуживание. Когда сервер вызывает операцию по контракту обратного вызова, он немедленно возвращается и не блокируется до завершения операции.

Void returns - Если IsOneWay не установлен в значение true, вызов все равно будет блокироваться до завершения операции, сообщение SOAP все равно будет возвращено, но без данных (если вы не передадите ошибки). Если вы хотите фактически вернуть значения, вы можете сделать это точно так же, как и обычным методам, задав тип возврата операции i.е

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    DateTime GetDateTime(); 
} 

public class Service : IService 
{ 
    public DateTime GetDateTime() 
    { 
     return DateTime.Now; 
    } 
} 

В качестве альтернативы, вы можете создать дуплексную службу, с контрактом обратного вызова, и IsOneWay = true

[ServiceContract(CallbackContract = typeof(ICallbackService))] 
public interface IService 
{ 
    [OperationContract(IsOneWay = true)] 
    void GetDateTime(); 
} 

public interface ICallbackService 
{ 
    [OperationContract(IsOneWay = true)] 
    void GetDateTimeCompleted(DateTime dateTime); 
} 

public class Service : IService 
{ 
    public void GetDateTime() 
    { 
     // Do long action here. 
     ... 
     Callback.GetDateTimeCompleted(DateTime.Now); 
    } 

    ICallbackService Callback 
    { 
     return OperationContext.Current.GetCallbackChannel<ICallbackService>(); 
    } 
} 

Используя этот метод:

  1. Вызов к операции вебсервиса GetDateTime() вернется немедленно
  2. «Очень длинная операция» будет выполняться на сервере
  3. GetDateTimeCompleted(DateTime dateTime) на клиенте запускается при завершении работы сервера.

Обратите внимание, что приведенный выше пример дуплекса не завершен, вам необходимо убедиться, что вы правильно обрабатываете такие вещи, как сеансы.

Вы определенно находитесь на правильном пути. Я бы рекомендовал следовать приведенным выше учебным пособиям (наряду с любыми другими, которые вы найдете) и экспериментировать. Скоро вы получите хорошее представление о том, что возможно.

+0

Сервисный договор может возвращать значения, однако если операция асинхронна - использование договора обратного вызова для возврата значения имеет смысл. @Ahhhhbisto Это точно? – Stix

+1

Это одно использование, да. Если 'IsOneWay = true', то клиентский вызов будет немедленно возвращен, и вы можете вернуть значение через контракт обратного вызова. Существуют и другие, более эффективные способы реализации асинхронных методов. Например, Svcutil может создавать либо асинхронные операции TAP, либо события из регулярных контрактов на обслуживание. Вы можете найти простой пример: http://adndevblog.typepad.com/cloud_and_mobile/2012/09/asynchronous-wcf-service-calls-using-net-framework-45.html – Ahhhhbisto

Смежные вопросы