在点击WCF服务之前添加一个检查

时间:2012-10-04 06:04:26

标签: wcf web-services

  

可能重复:
  WCF API Deployment Versioning

我正在开发WCF Rest服务。我有几个服务。 现在,在客户端点击服务之前,我想添加一个检查即可。版本号。 如果版本号小于,假设为2.0,那么客户端应用程序应该收到错误“应用程序已过时”并且它不应该命中该服务。

我的主要目的是,我不想在每个网络服务中应用此检查。我想要一些通用服务,首先检查版本,然后只允许客户端点击所需的服务。

如何做到这一点。 此外,这是否可以在.NET中的经典Web服务中使用。

1 个答案:

答案 0 :(得分:1)

我认为这是一个非常糟糕的主意 - 您需要创建一个集中式服务,以某种方式知道所有服务端点的所有版本详细信息,然后要求您的消费者进行额外调用以使用您的服务。

这会造成单点故障,如果“Version Checker”服务不可用,那么“有效”的消费者(具有正确客户端版本的消费者)仍然无法呼叫您的服务。

此外,您需要在此中心位置维护每个服务的当前版本,这会产生支持开销。

版本化服务的最佳方法是尝试进行不间断的更改,以便支持旧版本的客户端。你可以通过多种方式做到这一点。我在herehere之前发布了相关信息。

如果您必须进行重大更改,那么您需要让您的消费者中断(因此被迫升级),或者您在不同的端点共同托管不同版本的服务。

注意:有些内容专为您的想法而设计,称为UDDI。 UDDI服务器背后的想法是它可以存储有关您的服务的所有信息,包括端点地址,传输甚至是暴露的类型,以便消费者可以在运行时查询UDDI并即时组装客户端。

这将导致您的消费者根本不需要完全了解您的服务版本,并且会在运行时从UDDI检索此信息。

然而,很少使用UDDI(可能与引入单点故障的原因相同)。当我为客户构建ESB时,我在职业生涯中只使用过一次。

修改

在回复您的评论时,我认为最适合您的解决方案是在您的服务操作请求合同类型上公开Version成员,这将要求消费者声明他们期望调用哪个版本的服务。

收到请求后,您可以查询请求并检查版本。如果它们不匹配,那么您可以抛出在FaultContract中定义的类型的例外。 (更多关于错误合同here)。

这将使您的使用者能够将服务操作调用包装在catch块中并处理传回的自定义异常类型。我不认为有任何内置异常覆盖“无效版本”错误,因此您需要定义自己的错误。

这意味着,当用户尝试使用过时的版本属性调用您的服务时,只会收到异常,并且无需进行额外的服务调用。它还分发这些信息而不是集中它(这是更强大的方法)。

编辑2

在回复您的评论时,asmx不支持故障合同。您必须在服务上抛出异常,然后在客户端上将异常捕获为SoapException。在客户端,您必须询问SoapException消息(不好),以便解决是否因为版本控制。