Доступ к разделу System.ServiceModel файла App.Config в коде

У меня есть простая служба WCF, размещенная в консольном приложении, и я хотел бы отображать информацию app.config, такую ​​как базовый адрес и информация о конечной точке, на консоли без использования жестко закодированных значений в коде.

Это вообще возможно? Это звучит как достаточно правдоподобный сценарий в производственной среде, где приложение интересуется тем, как была настроена конфигурация?

Вот код хоста ...

class Program
{
    static void Main(string[] args)
    {

        using (ServiceHost host = new ServiceHost(typeof(ServiceImp.ServiceA)))
        {
            host.Open();

            // I would like to display info here
            // Console.Writeline ("Service hosted @ baseadress...., endpoint ABC is...");

            Console.WriteLine();
            Console.WriteLine("Press <ENTER> to terminate Host");
            Console.ReadLine();
        }
    }
}

Поиск в Google только кажется предлагает использовать ConfigurationManager.AppSettings, но это может получить доступ только к AppSettings, а не к содержимому System.ServiceModel.

заранее спасибо


person SkeetJon    schedule 13.01.2012    source источник


Ответы (3)


Доступ к конфигурации предоставляется через пространство имен System.ServiceModel.Configuration. Однако, если экземпляр 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(IMetadataException))
  {
    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());
  }
}

Просто изучите класс ServiceHost, в частности свойство Description.

person Christian.K    schedule 13.01.2012

В консольном приложении выполните следующие действия, чтобы прочитать полный файл app.config.

XDocument doc = XDocument.Load(Assembly.GetExecutingAssembly().Location +".config");

Теперь у вас будет содержимое app.config в объекте документа, через который вы можете выполнить итерацию, чтобы найти раздел system.servicemodel и получить требуемые значения.

Надеюсь, это поможет.

person Rajesh    schedule 13.01.2012

Если вы хотите сделать это без экземпляра ServiceHost, вы можете использовать следующий код.

ServiceModelSectionGroup section = ServiceModelSectionGroup.GetSectionGroup(config);

В коде предполагается, что у вас есть ссылка на объект конфигурации для приложения. Вы можете получить это с помощью объектов WebConfigurationManager или ConfigurationManager.

person Kepboy    schedule 13.02.2012