Загрузка другого EndpointBehavior из конфигурации программно

Можно ли обменяться поведением конечной точки конечной точки, определенной в файле app.config?

В основном у меня есть одна конечная точка с определенной пользовательской привязкой. Из кода я установил адрес конечной точки для прокси-клиента WCF. Я хотел бы использовать различные варианты поведения конечной точки в зависимости от адреса конечной точки.

псевдокод:

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

Возможно ли это (легко)? Я все еще хотел бы иметь свои определения поведения в app.config, но загружать их динамически в зависимости от адреса конечной точки.

2 ответа

Вы можете получить доступ к конфигурации через пространство имен 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

Например, для сервера: если экземпляр ServiceHost уже открыт, вы также можете получить доступ к большей части информации непосредственно с него.

// 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")

Другие вопросы по тегам