2012-06-14 6 views
4

У меня есть службы WCF, и я создаю клиент с помощью «Добавить ссылку на службу» с VS 2010.Как вызвать службу WCF Синхронно

Вопрос заключается в том, что служба в настоящее время вызывается асинхронно, хотя «Генерировать асинхронные операции "опции не отмечены. enter image description here

Так как я могу вызвать услугу синхронно? Где это поведение определено (на клиенте или сервере)? Я отчасти новичок в WCF.Kindly enlighten

Клиент - это консольное приложение.

У меня отключена функция «Генерировать асинхронные операции». Даже тогда прокси содержит следующие строки, которые указывают, что метод называется Asynchronously.Dont знаю, почему :)

[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

Update

Оказывается конфигурация WCF служба вызывает это асинхронное поведение, в частности, IsOneWay property of the OperationContract attribute. Это не технически асинхронно, но это "usually gives the appearance of asynchronous call".


Вам не нужно делать ничего особенного, просто вызовите обычный метод на прокси клиента - это синхронный метод. Так что если у вас есть метод WCF с именем DoSomething, то вы бы просто позвонить:

var client = new MyService.MyServiceClient(); 
client.DoSomething(); 

Это client.DoSomethingAsync, что это асинхронный метод.

Это различие относится к поведению клиента, независимо от того, блокирует ли ваше приложение поток при ожидании ответа службы WCF.

+0

Спасибо.Даже я ожидал, что сервис будет называться синхронно. Но некоторые, как сервис называется асинхронно. Поэтому мне пришлось добавить «waitHandle.WaitOne();» после вызова метода, чтобы я мог продолжить отладку кода, записанного в методе вызываемой операции. Я не понимаю, почему служба ведет себя таким образом. Служба уже была написана, и я просто создаю клиент для ее проверки. – Ananth

+0

@ Что такое платформа вашего клиентского приложения? Если это Silverlight, я, кажется, вспоминаю (какое-то время), что разрешены только асинхронные вызовы WCF. – McGarnagle

+0

Спасибо .. Его консольное приложение – Ananth

1

После того, как вы закончите добавлять ссылку на службу, вы должны получить синхронные методы для каждой открытой операции службы.

Синхронные методы называются такими же, как и служебная операция, например. GetCustomers. Асинхронные методы с другой стороны генерируются двумя способами: GetCustomersAsync, BeginGetCustomers/EndGetCustomers.

Если вы хотите получить клиентов синхронно, вам необходимо позвонить GetCustomers. В этом случае GetCustomers будет блокироваться до завершения сервисной операции, а затем код перемещается по следующей строке.

+0

Спасибо Эрин .. У меня нет метода «Async» в вызывающем методе. что означает, что метод является синхронным методом. Но он ведет себя асинхронно. Не знаю, по какой причине. Поэтому мне пришлось добавить «waitHandle.WaitOne();» после вызова метода, чтобы я мог продолжить отладку кода, записанного в методе вызываемой операции. – Ananth

+0

@Ananth Не могли бы вы также добавить код, в котором вы вызываете метод? Если вы вызываете ABC (не BeginABC), он должен быть синхронным. –

+0

Спасибо Эрин .. Я звоню ABC..Не BeginABC ... Iam, вставляя фактический код здесь. ABC был просто гипотетическим – Ananth

1

Если Генерировать асинхронные операции опция выключена, то служба будет называться синхронно

От MSDN

Генерировать асинхронные операции
Определяют, будут ли методы WCF службы можно назвать синхронно (по умолчанию) или асинхронно.

+0

У меня есть «Генерировать асинхронные операции». Даже тогда прокси содержит следующие строки, которые указывают, что метод называется Asynchronously. Не знаю, почему :) System.IAsyncResult BeginProcessCOBRecord (TestProject.ServiceReference1.ProcessCOBRecord запрос, обратный вызов System.AsyncCallback, объект asyncState); void EndProcessCOBRecord (результат System.IAsyncResult); – Ananth

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