0

我目前有一个 WCF 客户端,它能够进行临时服务发现以查找在本地子网上运行的(未知)服务。我想实现一种方法,让用户通过在文本框中输入 URI 来指定要使用的服务端点,并让客户端将此 URI 解析为EndpointAddress,并在此过程中收集有关服务的其他元数据。即,我需要收集EndpointIdentityEndpointDiscoveryBehavior.

我试图通过使用来实现这一点DiscoveryClient.Resolve(),但我只收到该ResolveResponse.EndpointDiscoveryMetadata属性的 null 。

String Address = "net.tcp://machine-name:12345/MyService"
DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());
var criteria = new ResolveCriteria()
{
    Address = new EndpointAddress(Address)
};
var result = discoveryClient.Resolve(criteria);
//scv is null here.....
var svc = result.EndpointDiscoveryMetadata;

我找到了很多关于 的信息,但关于 的信息DiscoveryClient.Find()并不多DiscoveryClient.Resolve()

所以我的问题是:

  • 这是 的预期用途DiscoveryClient.Resolve()吗?
  • MetadataResolver这里更合适吗?
  • 如何将 URI 解析为 aEndpointAddress并获取其他元数据?
4

2 回答 2

1

我认为您正在尝试复制 svcutil.exe 的功能。在这种情况下,您可能必须首先解析 mex 端点并从该端点 (IMetaDataExchange) 查询服务元数据。SPN 身份应该在元数据中。另请参阅参考http://msdn.microsoft.com/en-us/library/ms733130.aspx

于 2013-05-18T22:12:37.413 回答
1

我实现了我想做的事情:

String Address = "net.tcp://machine-name:12345/MyService"
DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());
var endpoint = new EndpointAddress(new Uri(Address));
var criteria = new ResolveCriteria()
{
    Address = endpoint
};
var result = discoveryClient.Resolve(criteria);

var mexClient = new MetadataExchangeClient(MetadataExchangeBindings.CreateMexTcpBinding());
var contracts = new List<ContractDescription>() { ContractDescription.GetContract(typeof(RuntimeService.Services.IWorkflowService)) };
var metaResult = MetadataResolver.Resolve(contracts, endpoint, mexClient);

var svc = metaResult.First();

我能够访问扩展数据,resultsvc为我提供正确的 EndpointAddress 以及正确的身份。

感谢@YK1 将我推向正确的方向。

于 2013-05-19T17:51:05.880 回答