Как вызвать службу WCF синхронно
У меня есть служба WCF, и я создаю клиента с помощью "Добавить ссылку на службу" из VS 2010.
Проблема заключается в том, что служба вызывается асинхронно, хотя параметры "Создать асинхронные операции" не отмечены.
Так как я могу позвонить в службу синхронно? Где определяется это поведение (на клиенте или сервере)? Я новичок в WCF. Пожалуйста, просветите
Клиент - это консольное приложение.
У меня отключена опция "Генерировать асинхронные операции". Даже тогда прокси содержит следующие строки, которые указывают, что метод вызывается асинхронно. Не знаю почему:)
[System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="urn:COBService")]
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(MemberType))]
void ABC(TestProject.ServiceReference1.ProcessCOBRecord request);
[System.ServiceModel.OperationContractAttribute(IsOneWay=true, AsyncPattern=true, Action="urn:COBService")]
System.IAsyncResult BeginABC(TestProject.ServiceReference1.ProcessCOBRecord request, System.**AsyncCallback** callback, object asyncState);
void EndABC(System.IAsyncResult result);
3 ответа
Обновить
Оказывается, конфигурация службы WCF вызывала это асинхронное поведение, в частности свойство IsOneWay атрибута OperationContract. Технически это не асинхронно, но "обычно создает вид асинхронного вызова".
Вам не нужно делать ничего особенного, просто вызовите обычный метод на клиентском прокси - это синхронный метод. Так что если у вас есть метод WCF с именем DoSomething, вам нужно просто вызвать:
var client = new MyService.MyServiceClient();
client.DoSomething();
Это client.DoSomethingAsync, который является асинхронным методом.
Это различие относится к поведению клиента, блокирует ли ваше приложение поток, ожидая ответа службы WCF.
Если опция " Создать асинхронные операции" снята, то служба будет вызываться синхронно
Из MSDN
Генерация асинхронных операций
Определяет, будут ли методы службы WCF вызываться синхронно (по умолчанию) или асинхронно.
После того, как вы добавите ссылку на службу, вы должны получить синхронные методы для каждой открытой операции службы.
Синхронные методы называются так же, как операции службы, например GetCustomers
, Асинхронные методы, с другой стороны, генерируются двумя способами: GetCustomersAsync
, BeginGetCustomers
/EndGetCustomers
,
Если вы хотите получить клиентов синхронно, вам нужно позвонить GetCustomers
, В таком случае, GetCustomers
будет блокироваться до тех пор, пока сервисная операция не будет завершена, а затем код перемещается на следующую строку.