4

我有一个 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);
4

3 回答 3

3

更新

事实证明,WCF 服务配置导致了这种异步行为,特别是OperationContract 属性的 IsOneWay 属性。这在技术上不是异步的,但它“通常呈现异步调用的外观”


您不必做任何特别的事情,只需调用客户端代理上的普通方法——这就是同步方法。因此,如果您有一个名为DoSomething的 WCF 方法,那么您只需调用:

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

client.DoSomethingAsync是异步方法。

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

于 2012-06-14T04:22:36.073 回答
1

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

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

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

于 2012-06-14T04:24:12.610 回答
1

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

来自MSDN

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

于 2012-06-14T04:24:51.517 回答