2012-10-04 68 views
1

可能重复之前增加一个检查:
WCF API Deployment Versioning打一个WCF服务

我在WCF REST服务工作。我有几项服务。 现在,在客户端访问服务之前,我想添加一个检查即viz。一个版本号。 如果版本号小于2.0,那么客户端应用程序应该会收到一个错误“应用程序已过期”,并且它不应该触发该服务。

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

这是怎么做到的。 此外,这是否可以在.NET中的经典Web服务中使用。

回答

1

我觉得这是一个非常糟糕的主意 - 你需要创建这在某种程度上知道你所有的服务端点的所有版本的详细信息的集中服务,然后要求你的消费者做出的额外调用,以消耗您服务。

这就造成故障在单个点,如果该“版本检查”服务不可用,那么“有效”的消费者(那些用正确的客户端版本)仍然将无法打电话给你的服务。你

也需要在这个中心位置,它产生支持成本,以保持每个服务的当前版本。

versionning您服务的最好办法是尝试让非断的变化,使老版本的客户端可以支持。你在很多方面都这样做。我之前在herehere之前发布过这个消息。

如果必须进行重大更改,则说明您需要让消费者打破(并因此被迫升级),或在不同的端点您共同主办不同版本的服务。

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

这将导致你的消费者需要绝对没有你的服务版本的知识可言,并且将检索从UDDI运行时,这个信息。

但是很少使用UDDI(可能出于同样的原因,它引入了单点故障)。当我为客户构建ESB时,我在我的职业生涯中只使用过它一次。

编辑

在回答您的意见,我想你最好的解决办法是暴露出版本成员对你的服务操作请求合同类型这就需要消费者申报服务的哪个版本他们期待打电话。

收到请求后,您可以询问请求并检查版本。如果它们不匹配,则可以抛出在FaultContract中定义的类型的异常。 (更多关于故障合同here)。

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

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

EDIT 2

在回答您的意见,故障合同不ASMX支持。你将不得不抛出异常的服务,然后在客户端捕获异常作为SoapException。在客户端上,您必须查询SoapException消息(不太好)才能确定是否因为版本控制。

+0

谢谢。我的要求。如果版本过期,我应该向客户端返回一个异常,以便他们向最终用户显示指向升级应用程序的链接。 – Marcus25

+0

请参阅我的更新。 –

+0

好的。我会试试这个。但是这也适用于Web服务。因为我以前的所有服务(旧版本)都是经典的.asmx Web服务 – Marcus25