WCF: как получить привязывающий объект от конфигурации

Я хочу получить объект Binding из web.config или app.config.

Итак, этот код работает:

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

но я хотел бы сделать следующее:

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

Мне интересен метод DoSomething(), конечно.

Ответы

Ответ 1

Вы можете создать связывание, дающее имя конфигурации привязки из 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");

Ответ 2

Отметьте это сообщение в блоге от Марка Габарры, оно показывает, как перечислять настроенные привязки

Ответ 3

Если вы не знаете тип привязки до выполнения, вы можете использовать следующее:

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

Где bindingType типа привязки и endpointConfigName - это имя, указанное в файле конфигурации.

Все включенные привязки предоставляют конструктор, который принимает конечное имя_конфигурацииName как единственный параметр, поэтому это должно работать для всех из них. Я использовал его для WsHttpBinding и NetTcpBinding без проблем.

Ответ 4

Одним из нахальных вариантов может быть создание экземпляра с конструктором по умолчанию для использования в качестве шаблона:

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

Затем уберите это и снова используйте его. Любая помощь?

Ответ 5

Этот ответ удовлетворяет запросу OP и на 100% извлечен из этой удивительной почты от Пабло М. Чибраро.

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;
}