【问题标题】:How to call a WCF service Synchronously如何同步调用 WCF 服务
【发布时间】:2012-06-17 02:26:57
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    更新

    事实证明,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 服务响应时是否阻塞线程。

    【讨论】:

    • 谢谢。即使我希望该服务会被同步调用。但是有些服务是如何被异步调用的。所以我不得不添加“waitHandle.WaitOne();”在方法被调用之后,我可以继续调试被调用操作方法中编写的代码。我不明白为什么服务会以这种方式运行。服务已经写好了,我只是创建一个客户端来测试它。
    • @Ananth 您的客户端应用程序是什么平台?如果是 Silverlight,我似乎记得(已经有一段时间了)只允许异步调用 WCF。
    • 谢谢.. 它是一个控制台应用程序
    • 我已经更新了问题。我在生成的代理类中看到一行代码,我认为它正在使其行为异步。但我不明白为什么会发生这种情况,即使我没有选中“生成异步操作”.. :)
    • @Ananth 这很奇怪......我想知道它是否是服务配置的某些部分使其异步。不过,既然没有返回类型(“void”),为什么还要等待响应呢?
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢 Erin.. 我在调用方法中没有“异步”。这意味着该方法是同步方法。但它以异步方式运行。不知道是什么原因。所以我不得不添加“waitHandle.WaitOne();”方法调用后,我可以继续调试调用的操作方法中编写的代码。
    • @Ananth 您能否在调用该方法的位置添加代码?如果你调用 ABC(不是 BeginABC),它应该是同步的。
    • 谢谢 Erin..我打电话给 ABC..Not BeginABC...我在这里粘贴实际代码..ABC 只是假设
    【解决方案3】:

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

    来自MSDN

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

    【讨论】:

    • 我没有选中“生成异步操作”。即使这样,代理也包含以下行,表明该方法是异步调用的。不知道为什么:) System.IAsyncResult BeginProcessCOBRecord(TestProject.ServiceReference1.ProcessCOBRecord request, System.AsyncCallback callback, object asyncState); void EndProcessCOBRecord(System.IAsyncResult 结果);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    相关资源
    最近更新 更多