我创建了一个DynamicEndpoint来自动查找WCF服务。
namespace Client
{
class Program
{
static void Main(string[] args)
{
DynamicEndpoint dynamicEndpoint = new DynamicEndpoint(ContractDescription.GetContract(typeof(ICalculator)), new NetTcpBinding());
using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>(dynamicEndpoint))
{
ICalculator caculate = channelFactory.CreateChannel();
Console.WriteLine("x + y = {2} when x = {0} and y = {1}", 4, 9, caculate.Add(4, 9));
Console.WriteLine("Find service, the service address is: " + dynamicEndpoint.Address.Uri);
}
Console.Read();
}
}
}
问题是当我尝试打印服务地址时,返回值为
http://schemas.microsoft.com/discovery/dynamic
那不是我发布的真实服务地址。
1.如何获得真实的服务地址?
2.如果有多种服务可用,DynamicEndpoint将选择哪一项?我可以获取地址数组或列表吗?
答案 0 :(得分:1)
据我所知,我们无法获得客户端的实际使用端点。除了我们使用OperationContext对象之外,该对象提供对服务方法的执行上下文的访问。
https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.operationcontext?redirectedfrom=MSDN&view=netframework-4.7.2
例如,我们可以参考以下代码来获取实际的端点。
服务器。
public string GetAddress()
{
OperationContext oc = OperationContext.Current;
string result=oc.Channel.LocalAddress.Uri.ToString();
return result;
}
客户。
ChannelFactory<IService> factory = new ChannelFactory<IService>(dynamicEndpoint);
IService sv = factory.CreateChannel();
Console.WriteLine(sv.GetAddress());
此外,我不认为动态端点可以列出已找到的端点。动态端点将服务发现与服务调用合并。使用动态端点调用服务时,它将依赖于FindCriteria属性来找到服务端点,然后对其进行调用。
https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.discovery.dynamicendpoint?view=netframework-4.7.2
https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.discovery.findcriteria?view=netframework-4.7.2