我目前有一个WCF客户端能够进行临时服务发现,以查找在本地子网上运行的(未知)服务。我想为用户实现一种方法,通过在文本框中输入URI来指定要使用的服务端点,并让客户端将此URI解析为EndpointAddress
,并在此过程中收集有关的其他元数据服务。也就是说,我需要收集在EndpointIdentity
的扩展程序属性中公开的EndpointDiscoveryBehavior
和其他数据。
我正在尝试使用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
更合适吗?EndpointAddress
并获取其他元数据?答案 0 :(得分:1)
我认为您正在尝试复制svcutil.exe的功能。在这种情况下,您可能必须首先解析mex端点并从该端点查询服务元数据(IMetaDataExchange)。 SPN标识应位于元数据中。 另请参阅参考http://msdn.microsoft.com/en-us/library/ms733130.aspx
答案 1 :(得分: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();
我可以通过result
获取扩展数据,svc
为我提供了正确的EndpointAddress,并且标识正确。
感谢@ YK1让我朝着正确的方向前进。