【问题标题】:Client's method description for WCF serviceWCF服务的客户端方法描述
【发布时间】:2015-09-10 05:12:44
【问题描述】:

我有一个 WCF 服务(托管在 windows-service 中)和一个客户端。

它们交互如下:客户端发送请求,服务获取它并返回 HTTP 200。客户端还将其地址传递给 WS-Addressing 标头中的答案。暂时就这些了

几个小时后,windows-service 应该会发送该请求的结果。客户有一个可以得到结果的网络方法。所以问题是:将获得结果的客户端方法的描述(方法名称,它的参数)应该在哪里?客户端应该公开它的 WSDL,还是我应该把那个描述放在我的 WSDL 中(如果它是这样工作的)?

【问题讨论】:

  • 客户端没有 WSDL - 只有服务。您是否希望客户端在服务发回结果所需的几个小时内保持连接?这不是我认为好的 Web 服务设计。在这几个小时内,可能会发生很多事情会导致断开连接。无论如何,听起来您想要一个双工绑定(用于从服务回调到客户端)。您能否针对您的情况提供更多详细信息和代码示例?
  • 当然客户端不会保持连接几个小时。正如我所说,它获得了 HTTP 200,这就是它的请求的结束。客户端有自己的网络方法,其中之一是从我的 WCF 获得答案。那么谁应该负责这个方法的描述,所以我可以调用它?
  • 所以客户端本身也是一个服务?至于客户端稍后从服务中获得答案,那应该是客户端调用的服务公开的方法。如果其他客户端正在调用第一个客户端,那么第一个客户端(充当服务)也可以公开一个获取结果的方法。即,服务 A 进行处理。客户端 A(也是服务 B)可以从服务 A 请求结果。客户端 A(充当服务 B)也可以公开客户端 C 可以使用的类似方法。
  • 不,客户端不应该调用 WCF 服务来获取结果,因为在这种情况下他会重复调用它(因为他不知道结果是否准备好)。它的 WCF 服务在准备好后立即发送结果。抱歉,我忘了说 WCF 托管在 windows 服务中,所以是 windows-service 将结果发送给客户端。
  • 啊。在这种情况下,一种解决方案是让客户端(同样,作为服务和客户端)具有“主”服务可以调用的方法,因此它将位于客户端的 WSDL 中。服务 A(托管 WCF 的 Windows 服务)根据来自客户端的请求进行处理(同样,它本身就充当服务)。然后服务 A 会调用客户端返回结果。这有意义吗?

标签: wcf wsdl


【解决方案1】:

据我了解,您有两个服务,我们称它们为服务 A(托管在 Windows 服务中)和服务 B。服务 B 向服务 A 发送请求(换句话说,它就像一个客户端)让服务 A 启动某种长期运行的任务。

任务完成后,服务 A 需要将结果发送给服务 B。由于它是一个长时间运行的任务,因此使用双工绑定是理想的。但是,服务 A 可以调用服务 B 公开的方法来发送结果。

类似这样的:

[ServiceContract]
public interface IServiceA
{

    [OperationContract]
    public void StartWork();
}

[ServiceContract]
public interface IServiceB
{

    [OperationContract]
    public void ReceiveResults(ResultData data);
}

其中ResultData 是一些包含结果的对象(也可以是简单类型,这只是为了说明)。 ServiceA 的 StartWork 可以返回 void(响应仍将发送到客户端,因为它没有标记为 IsOneWay=true)。半伪代码如下:

开始任务:

ServiceAClient client = new ServiceAClient();
client.Open();
client.StartWork();
client.Close();

任务完成后,服务 A 将结果发送给服务 B:

ResultData results = new ResultData();
ServiceBClient client = new ServiceBClient();
client.Open();
client.ReceiveResults(results);
client.Close();

在这种情况下,接收结果的方法将是服务 B 的 WSDL 的一部分,因为服务 A 将调用该方法。

【讨论】:

  • @Tim 恭喜您获得 WCF 银质徽章!您加入了一个由 12 个用户组成的专属组。说实话,我是在和你比赛;)
  • @TomRedfern - 谢谢 - 你可能会击败我获得金牌 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多