从c#客户端调用c#wcf webservice

时间:2012-06-27 15:26:35

标签: c# wcf parallel-processing httpwebrequest

我有一个c#wcf网络服务和一个c#客户端,它可以调用Web服务,该服务工作正常并且有一个类似下面的方案,我无法弄明白该怎么做。

在这种情况下,我在c#client中有2个方法,因为第一种方法会占用更多时间,而客户端不知道wcf web服务的响应会花多长时间,所以我们实现了第二种方法给出第一个方法调用的状态(说第一个方法总共有10个任务,当前正在执行1或2或3等)。现在我不知道调用如何进入第二种方法,因为第一种方法还没有完成,因为这两种方法都必须在同一个客户端。任何人都可以帮忙解决这个问题。

2 个答案:

答案 0 :(得分:2)

解决此类问题的最佳方法是跨多个不同的WCF方法拆分任务,将调用链接起来。例如:

而不是这样做(只是一个概念证明):

serviceClient = new MyWCFClient();
serviceClient.TaskThatTakesForeverCompleted += (s,e) => { /*I'm done !*/ };
serviceClient.TaskThatTakesForeverAsync();

你最终会这样做:

serviceClient = new MyWCFClient();
serviceClient.FirstTaskCompleted += (s,e) => { /*first task done!*/ serviceClient.SecondTaskAsync(); };
serviceClient.SecondTaskCompleted += (s,e) => { /*and so on... */ };
...
serviceClient.FirstTaskAsync();

虽然服务器端你实现它是这样的:

[OperationContract]
public <return type> FirstTask() { /* code */}
[OperationContract]
public <return type> SecondTask() { /* more code */ }

当然,这可能不适用于您的情况,但很长的任务可以以这种方式拆分。

警告:这种实现绝对是不是最佳实践,因为您会发现自己有一堆必须以固定顺序调用的方法(FirstTask必须是第一个,然后是SecondTask,依此类推)但最终它将处理知道服务正在做什么的问题。

解释起来真的比理解起来更难,所需要的只是摆弄它是一个非常简单的逻辑。

注意:如果您没有异步调用,请按以下方式启用它们:

  • 右键单击服务参考
  • “配置服务参考”
  • 选中“生成异步操作”,取消选中“生成消息合同”,其他所有内容保持原样
  • 现在您可以随时使用异步电话了

答案 1 :(得分:1)

如果我理解正确...您需要实现异步调用。 默认情况下,WCF中的所有调用都是同步的。

您现在拥有的是同步调用。:

  1. Method1(Client)调用Method2(Server)完成任务。
  2. Method1等待很长时间,直到Method2完成
  3. Method1从方法2
  4. 接收true(或其他)
  5. 方法1可以继续做事。
  6. 您需要的是:

    1. Method1(Client)调用Method2(Server)
    2. Method2

      2.1验证请求是否正确形成

      2.2创建一个带有工作过程的线程

      2.3返回true(表示确定,我已将您的请求排队)

      2.4 Method1继续做其中的事情。

    3. 然后你有两个选择:

        

      3A。当Method2完成时,它会调用客户端中的另一个方法进行报告   它已经完成(在客户端说方法3)

           

      3B。 Method1查询Server中的另一个方法(在Server中的Say4中查看)   任务每隔x秒进行一次,并在屏幕上显示或做任何想做的事情直到完成。

      您可以查看此MSDN link,了解如何在WCF中实现异步方法。