[英]Contract discovery in WCF after Service Contract Inheritence
WCF的旧版本根据接口的旧版本进行交付
<endpoint name="ServiceName" address="http://production.server/Service.svc"
binding="basicHttpBinding" bindingConfiguration="myBasicHttpBinding"
contract="myAPI.IOriginalService" />
随着新版本的交付
<endpoint name="ServiceName" address="http://development.server/Service.svc"
binding="basicHttpBinding" bindingConfiguration="myBasicHttpBinding"
contract="myAPI.IDerivedService" />
这很好。 旧客户端可以通过请求IOriginalService
来连接到任一服务器,而新客户端可以要求IDerivedService
...,但是它们只能向开发服务器请求,如果他们向生产服务器询问,则会引发错误。 没事的
我宁愿让新客户尝试变得聪明一点,并在可能的时候使用新格式,但是如果不可用,则使用旧格式。 我可以捕捉到异常,但这很昂贵,我宁愿进行测试,也不愿捕捉已知的可能结果。
因此,我想连接到端点并要求其提供合同价值,然后使用返回值来确定要询问的类型,例如
var endPoint = someMethod("ServiceName");
var contractName = endPoint.WhatContractDoYouOffer();
if(contractName == "IOriginalService")
CallAMethod<IOriginalService>(parameters);
else
CallAMethod<IDerivedService>(newParameters);
这可行吗?
WCF中没有“开箱即用”的功能来支持此功能-可能除外:
但是要在客户端确定连接的位置。
您可能会想出一个“调度程序” WCF服务,您可以问该去哪里签约-但至少此WCF服务的终结点和合同必须始终保持固定。
当然,您可以在客户端app.config中具有多个端点-可以将这些端点加载到内存中并进行检查:
ClientSection cs = ConfigurationManager.GetSection("system.serviceModel/client") as ClientSection;
if(cs != null)
{
foreach (ChannelEndpointElement ep in clientSection.Endpoints)
{
if(ep.Contract == 'IMyService')
{
Uri endpointAddress = e.Address;
}
}
}
这样,您可以创建一个包含所有端点的单个客户端配置,并且可以动态找到您感兴趣的配置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.