如何同步调用WCF服务

时间:2012-06-14 04:17:09

标签: wcf visual-studio-2010 c#-4.0 wcf-binding wcf-behaviour

我有一个WCF服务,我正在使用VS 2010中的“添加服务引用”创建客户端。

问题是,虽然未选中“生成异步操作”选项,但异步调用服务。enter image description here

那么如何同步调用服务呢?这个行为在哪里定义(在客户端或服务器上)?我是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 个答案:

答案 0 :(得分:3)

<强>更新

事实证明,WCF服务配置导致了这种异步行为,特别是IsOneWay property of the OperationContract attribute。这在技术上并不是异步的,而是"usually gives the appearance of asynchronous call"


您不必执行任何特殊操作,只需在客户端代理上调用常规方法 - 这就是同步方法。因此,如果您有一个名为 DoSomething 的WCF方法,那么您只需调用:

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

它是 client.DoSomethingAsync ,它是异步方法。

这种区别与客户端行为有关,无论您的应用程序是否在等待WCF服务响应时阻塞该线程。

答案 1 :(得分:1)

添加完服务引用后,您应该为每个公开的服务操作获取同步方法。

同步方法的命名与服务操作相同,例如: GetCustomers。另一方面,异步方法以两种方式生成:GetCustomersAsyncBeginGetCustomers / EndGetCustomers

如果您希望同步获取客户,则需要致电GetCustomers。在这种情况下,GetCustomers将阻塞,直到服务操作完成,然后代码在下一行上移动。

答案 2 :(得分:1)

如果未选中生成异步操作选项,则将同步调用该服务

来自MSDN

  

生成异步操作
  确定是否将同步调用WCF服务方法   (默认)或异步。