Конфигурация клиента WCF: как я могу проверить, находится ли конечная точка в файле конфигурации, и отказать в коде, если нет?

Глядя на создание клиента, который отправляет объекты с сериализованным сообщением обратно на сервер через WCF.

Чтобы облегчить работу конечного разработчика (разных отделов), было бы лучше, чтобы им не нужно было знать, как редактировать их конфигурационный файл для настройки данных конечной точки клиента.

Тем не менее, было бы прекрасно, что конечная точка не была встроена/жестко закодирована в Client.

Мне кажется, что сценарий микширования будет самым простым решением для развертывания:

IF (описанный в config) USE config file ELSE возвращает к жестко запрограммированной конечной точке.

Что я узнал:

  • new Client(); завершается сбой, если определение файла конфигурации не найдено.
  • new Client(binding,endpoint); работает

поэтому:

Client client;
try {
  client = new Client();
}catch {
  //Guess not defined in config file...
  //fall back to hard coded solution:
  client(binding, endpoint)
}

Но есть ли способ проверить (кроме try/catch), чтобы убедиться, что в файле конфигурации объявлена ​​конечная точка?

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

Ответ 1

Вот как читать файл конфигурации и загружать данные в легко управляемый объект:

Configuration c = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConfigurationSectionGroup csg = c.GetSectionGroup("system.serviceModel");
if (csg != null)
{
    ConfigurationSection css = csg.Sections["client"];
    if (css != null && css is ClientSection)
    {
        ClientSection cs = (ClientSection)csg.Sections["client"];
        //make all your tests about the correcteness of the endpoints here
    }
}

Объект "cs" откроет коллекцию с именем "конечные точки", которая позволит вам получить доступ ко всем свойствам, которые вы найдете в файле конфигурации.

Убедитесь, что вы также обрабатываете ветки "else" "if" s и рассматриваете их как случаи сбоя (конфигурация недействительна).

Ответ 2

Я хотел бы предложить улучшенную версию AlexDrenea решения, которое использует только специальные типы для разделов конфигурации.

Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        ServiceModelSectionGroup serviceModelGroup = ServiceModelSectionGroup.GetSectionGroup(configuration);
        if (serviceModelGroup != null)
        {
            ClientSection clientSection = serviceModelGroup.Client;
            //make all your tests about the correcteness of the endpoints here

        }