WCF: как получить объект Binding из конфигурации

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

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

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

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

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

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

10.12.2008 10:03:33
5 ОТВЕТОВ
РЕШЕНИЕ

Вы можете создать экземпляр привязки с именем конфигурации привязки из 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");
6
13.10.2016 20:37:35
Только если вы знаете, какой тип привязки вы собираетесь использовать, например, WSHttpBinding или NetTcpBiding. Вы теряете гибкость, чтобы изменить вид ожидания во время выполнения.
Anthony 15.10.2009 12:51:03
Но мне нужна какая-то привязка, не только (WSHttpBinding)
Sawan 26.12.2012 11:12:03
Для пользовательских привязок: var binding = new System.ServiceModel.Channels.CustomBinding ("BindingName");
Sal 12.01.2017 16:58:46

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

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

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

6
10.12.2008 11:05:36
Лучше, чем ничего :) Но я бы хотел получить объект привязки из конфигурационного файла, загрузить его по имени.
bh213 10.12.2008 11:17:41

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

7
16.12.2008 15:49:41
Это только объясняет, как перечислить настроенные привязки. Для полной вещи проверьте мой ответ.
daniloquio 20.10.2015 17:00:20

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

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

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

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

7
29.04.2010 19:40:58
Это только объясняет, как инициализировать объект Binding, начиная с абстрактного определения конфигурации. Для полной вещи проверьте мой ответ :)
daniloquio 20.10.2015 17:01:21

Этот ответ выполняет запрос 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;
}
9
20.10.2015 16:58:28