【发布时间】:2012-09-22 13:28:30
【问题描述】:
我们能否在不使用 Visual Studio 中的添加引用的情况下动态地将服务引用添加到项目中。元数据的 Wsdl 导入是否有助于实现这一目标,有人可以帮助我动态加载服务并将其附加到项目并在 wcf 中使用客户端,或者建议我实现这一目标的方法。
【问题讨论】:
标签: wcf wcf-data-services wcf-binding wcf-client
我们能否在不使用 Visual Studio 中的添加引用的情况下动态地将服务引用添加到项目中。元数据的 Wsdl 导入是否有助于实现这一目标,有人可以帮助我动态加载服务并将其附加到项目并在 wcf 中使用客户端,或者建议我实现这一目标的方法。
【问题讨论】:
标签: wcf wcf-data-services wcf-binding wcf-client
.NET 框架有一个专门用于此的命名空间,称为 System.ServiceModel.Discovery。从较高级别您可以使用DiscoveryClient,它可以找到可用的服务。
为了能够使用DiscoveryClient 定位服务,需要通过AnnouncementClient 类发送服务信息。此类允许服务发布公告消息。来自文档:
公告消息包含有关服务的信息,例如其完全限定的合同名称、服务运行的任何范围以及服务想要发送的任何自定义元数据。
这些类应该是您为动态服务发现和使用提供管道所需的一切。
【讨论】:
如果您尝试使用现有的第三方端点(不受您控制的服务),.NET 框架中至少提供了两种方法。
MetadataExchangeClient 将连接到 MEX/wsdl 端点并返回代表服务元数据的对象集合。
如果您将 MEX/wsdl 端点和要解析的类型传递给 MetadataResolver,它将返回已知服务的配置。这允许您导入连接设置,而无需预先指定。
要查看还有什么可用的,请探索 System.ServiceModel.Description 命名空间。它具有上述两个类以及与动态服务解析相关的其他类。
编辑:这能够为我检索元数据:
MetadataExchangeClient client = new MetadataExchangeClient(
new Uri("http://localhost:22948/Service1.svc?wsdl"),
MetadataExchangeClientMode.HttpGet);
var response = client.GetMetadata();
【讨论】: