Откройте раздел System.ServiceModel файла App.Config в коде. - PullRequest
1 голос
/ 13 января 2012

У меня есть простая служба 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.

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

Ответы [ 3 ]

2 голосов
/ 13 января 2012

Доступ к конфигурации обеспечивается через пространство имен 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.

0 голосов
/ 13 февраля 2012

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

ServiceModelSectionGroup section = ServiceModelSectionGroup.GetSectionGroup(config);

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

0 голосов
/ 13 января 2012

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

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

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

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

...