可能重复:
WCF API 部署版本控制
我正在开发 WCF Rest 服务。我有几个服务。现在,在客户点击服务之前,我想添加一个检查即。一个版本号。如果版本号小于,假设 2.0,那么客户端应用程序应该得到一个错误“应用程序已过时”并且它不应该命中服务。
我的主要目的是,我不想在每个 web 服务中应用这个检查。我想要一些通用服务,它首先检查版本,然后只允许客户端访问所需的服务。
如何才能做到这一点。此外,这在 .NET 的经典 Web 服务中是否可行。
可能重复:
WCF API 部署版本控制
我正在开发 WCF Rest 服务。我有几个服务。现在,在客户点击服务之前,我想添加一个检查即。一个版本号。如果版本号小于,假设 2.0,那么客户端应用程序应该得到一个错误“应用程序已过时”并且它不应该命中服务。
我的主要目的是,我不想在每个 web 服务中应用这个检查。我想要一些通用服务,它首先检查版本,然后只允许客户端访问所需的服务。
如何才能做到这一点。此外,这在 .NET 的经典 Web 服务中是否可行。
我认为这是一个非常糟糕的主意 - 您需要创建一个集中式服务,该服务以某种方式知道所有服务端点的所有版本详细信息,然后要求您的消费者进行额外调用以使用您的服务。
这会产生单点故障,因为如果“版本检查器”服务不可用,那么“有效”消费者(具有正确客户端版本的消费者)仍将无法调用您的服务。
此外,您还需要在此中心位置维护每个服务的当前版本,这会产生支持开销。
对服务进行版本控制的最佳方法是尝试进行非破坏性更改,以便支持旧版本的客户端。您可以通过多种方式做到这一点。我在这里和这里之前已经发布过这个。
如果您必须进行重大更改,那么您需要让您的消费者中断(因此被迫升级),或者您在不同的端点共同托管不同版本的服务。
注意:有一种东西是为您所想的而设计的,称为UDDI。UDDI 服务器背后的想法是它可以存储有关您的服务的所有信息,包括端点地址、传输甚至您的公开类型,以便消费者可以在运行时查询 UDDI 并即时组装客户端。
这将导致您的消费者完全不需要知道您的服务版本,并且会在运行时从 UDDI 检索此信息。
然而,UDDI 很少使用(可能与它引入单点故障的原因相同)。在我的职业生涯中,当我为客户构建 ESB 时,我只使用过一次。
编辑
针对您的评论,我认为对您来说最好的解决方案是在您的服务操作请求合同类型上公开一个版本成员,这将要求消费者声明他们期望调用的服务版本。
收到请求后,您可以查询请求并检查版本。如果它们不匹配,那么您可以抛出您在 a 中定义的类型的异常FaultContract
。(更多关于过错合同在这里)。
这将使您的消费者能够将服务操作调用包装在一个 catch 块中并处理传回的自定义异常类型。我认为没有任何内置异常可以涵盖“无效版本”错误,因此您需要自己定义。
这意味着消费者只有在尝试使用过时的版本属性调用您的服务时才会收到异常,并且避免了进行额外的服务调用。它还分发这些信息而不是集中它(这是更强大的方法)。
编辑 2
作为对您的评论的回应,asmx 不支持故障合同。您必须在服务上引发异常,然后在客户端上将异常捕获为SoapException。然后,在客户端上,您必须询问 SoapException 消息(不是很好)才能确定它是否是因为版本控制。