.NET - развертывание WCF-клиента без app.config

Я пишу клиента в службу WCF. Это одно приложение в более крупной системе, которая включает модули, написанные на С#, С++, VB и Java. Все приложения имеют общие настройки и механизмы регистрации, независимо от того, на каком языке они были написаны.

Я хотел бы выяснить, как создать клиентское приложение, чтобы оно выполнялось без app.config. Зачем? Поскольку большинство из того, что находится в app.config, является шаблоном, который нельзя разрешить системным администраторам, и какие параметры, которые должны быть разрешены для сисадминов, должны быть в общесистемной конфигурации, а не в файле app.config сидя в каталоге bin.

Дело в точке - клиент app.config теперь выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <customBinding>
        <binding name="WSHttpBinding_ICourierService">
          <security defaultAlgorithmSuite="Default" authenticationMode="SecureConversation"
            ...
          </security>
          <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
            messageVersion="Default" writeEncoding="utf-8">
            <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647"
              maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          </textMessageEncoding>
          <httpTransport manualAddressing="false"
            ...
            useDefaultWebProxy="true" />
        </binding>
      </customBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:57102/MyService.svc"
        ...
        >
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>
</configuration>

Это куча непрозрачного шаблона, с которым сисадмины не должны иметь дело. Большая часть его была вставлена ​​Visual Studio. Я сделал одно изменение в файле - я увеличил максимальный размер в <readerQuotas/>. Но это изменение, в котором я не хочу, чтобы сисадмины возились. И ничего больше в файле я хочу, чтобы sysadmins возились, кроме <endpoint address=""/>.

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

Итак, как мне настроить такие вещи, чтобы мне не нужно было представлять их?

Могу ли я вставить его в качестве ресурса в сборку и подключиться к процессу загрузки app.config, как это сделать с требуемыми DLL?

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

Ответ 1

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

    var binding = new WSHttpBinding();
    binding.SendTimeout = new TimeSpan(0, 0, 0, 0, 100000);
    binding.OpenTimeout = new TimeSpan(0, 0, 0, 0, 100000);
    binding.MaxReceivedMessageSize = 10000;
    binding.ReaderQuotas.MaxStringContentLength = 10000;
    binding.ReaderQuotas.MaxDepth = 10000;
    binding.ReaderQuotas.MaxArrayLength = 10000;
    var endpoint = new EndpointAddress("http://localhost:57102/MyService.svc");
    var myClient = new WebServiceclient(binding, endpoint);

Ответ 2

Настройки WCF могут быть установлены в вашем коде, без необходимости внешнего файла конфигурации. Адреса, привязки, конечные точки, безопасность и т.д. Могут быть сконфигурированы в коде. Это лучший способ быть последовательным во всех ваших WCF-сервисах и не позволять пользователям изменять эти настройки.

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