17

我想从 web.config 或 app.config 中获取 Binding 对象。

所以,这段代码有效:

wcfTestClient = new TestServiceClient("my_endpoint", Url + "/TestService.svc");

但我想做以下事情:

Binding binding = DoSomething();
wcfTestClient = new TestServiceClient(binding, Url + "/TestService.svc");

当然,我对 DoSomething() 方法很感兴趣。

4

5 回答 5

10

这个答案满足了 OP 的要求,并且 100% 来自 Pablo M. Cibraro 的这篇精彩的帖子。

http://weblogs.asp.net/cibrax/getting-wcf-bindings-and-behaviors-from-any-config-source

此方法为您提供配置的绑定部分。

private BindingsSection GetBindingsSection(string path)
{
  System.Configuration.Configuration config = 
  System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(
    new System.Configuration.ExeConfigurationFileMap() { ExeConfigFilename = path },
      System.Configuration.ConfigurationUserLevel.None);

  var serviceModel = ServiceModelSectionGroup.GetSectionGroup(config);
  return serviceModel.Bindings;
}

此方法为您提供了您Binding迫切需要的实际对象。

public Binding ResolveBinding(string name)
{
  BindingsSection section = GetBindingsSection(path);

  foreach (var bindingCollection in section.BindingCollections)
  {
    if (bindingCollection.ConfiguredBindings.Count > 0 
        && bindingCollection.ConfiguredBindings[0].Name == name)
    {
      var bindingElement = bindingCollection.ConfiguredBindings[0];
      var binding = (Binding)Activator.CreateInstance(bindingCollection.BindingType);
      binding.Name = bindingElement.Name;
      bindingElement.ApplyConfiguration(binding);

      return binding;
    }
  }

  return null;
}
于 2015-10-20T16:58:28.213 回答
7

查看Mark Gabarra 的这篇博文,它展示了如何枚举配置的绑定

于 2008-12-16T15:49:41.283 回答
7

如果您直到运行时才知道绑定的类型,您可以使用以下内容:

return (Binding)Activator.CreateInstance(bindingType, endpointConfigName);

其中 bindingType 的绑定类型和 endpointConfigName 是配置文件中指定的名称。

所有包含的绑定都提供了一个构造函数,该构造函数将 endpointConfigurationName 作为唯一参数,因此这应该适用于所有绑定。我已经将它用于 WsHttpBinding 和 NetTcpBinding 没有问题。

于 2010-04-29T19:40:58.230 回答
6

一个厚颜无耻的选择可能是使用默认构造函数创建一个实例,以用作模板:

Binding defaultBinding;
using(TestServiceClient client = new TestServiceClient()) {
    defaultBinding = client.Endpoint.Binding;
}

然后把它收起来并重新使用它。有什么帮助吗?

于 2008-12-10T11:05:36.413 回答
6

您可以从 App.config/Web.config 实例化提供绑定配置名称的绑定。

http://msdn.microsoft.com/en-us/library/ms575163.aspx

使用由其配置名称指定的绑定初始化 WSHttpBinding 类的新实例。

下面的示例演示如何使用字符串参数初始化 WSHttpBinding 类的新实例。

// Set the IssuerBinding to a WSHttpBinding loaded from config
b.Security.Message.IssuerBinding = new WSHttpBinding("Issuer");
于 2008-12-16T09:20:38.230 回答