我有一个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);
答案 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
。另一方面,异步方法以两种方式生成:GetCustomersAsync
,BeginGetCustomers
/ EndGetCustomers
。
如果您希望同步获取客户,则需要致电GetCustomers
。在这种情况下,GetCustomers
将阻塞,直到服务操作完成,然后代码在下一行上移动。
答案 2 :(得分:1)