以编程方式从配置加载不同的端点行为

本文关键字:端点 加载 编程 方式 配置 | 更新日期: 2023-09-27 18:32:19

是否可以交换 app.config 文件中定义的端点的端点行为?

基本上,我有一个具有定义的自定义绑定的单个终结点。我从代码中设置 WCF 代理客户端的终结点地址。我想根据终结点地址使用不同的终结点行为。

伪代码:

var client = new WcfClient("endpointName", new endpointAddress("https://..."));
client.Endpoint.Behaviors.Add(EndpointBehavior.CreateFromConfig("behaviorName"));

这(容易)可能吗?我仍然希望在 app.config 中包含我的行为定义,但根据端点的地址动态加载它们。

以编程方式从配置加载不同的端点行为

您可以通过 System.ServiceModel.Configuration 命名空间访问配置。阅读相应的部分并手动构建您的端点/行为...

您还可以创建多个终端节点并按名称实例化客户端:http://msdn.microsoft.com/en-us/library/ms751515.aspx

您还可以尝试使用配置命名空间中的 BehaviorExtensionElement 来尝试创建行为。我在这里找到了一个例子:http://weblogs.asp.net/cibrax/archive/2010/05/11/getting-wcf-bindings-and-behaviors-from-any-config-source.aspx

例如,对于服务器:如果服务主机实例已打开,您还可以直接从中访问大多数信息

// BaseAddress
Console.WriteLine(serviceHost.BaseAddress);
// Endpoints (non-MEX)
foreach (ServiceEndpoint ep in serviceHost.Description.Endpoints)
{
  if (serviceHost.BaseAddress.Any(uri => uri.Equals(ep.ListenUri) &&
      ep.Contract.ContractType != typeof(IMetadataExchange))
  {
    Console.WriteLine("ListenURI: " + ep.ListenUri);
    Console.WriteLine("  Name   : " + ep.Name);
    Console.WriteLine("  Binding: " + ep.Binding.GetType().FullName);
  }
}
// List of MEX endpoints:
foreach (ServiceEndpoint ep in serviceHost.Description.Endpoints)
{
  if (ep.Contract.ContractType == typeof(IMetadataExchange))
  {
    Console.WriteLine(ep.ListenUri.ToString());
  }
}

在运行时设置端点:

yourProxy.ChannelFactory.Endpoint.Address = New ServiceModel.EndpointAddress("someSvcURL")