Изменение ссылочного URL-адреса службы WCF в зависимости от среды - PullRequest
7 голосов
/ 28 апреля 2009

У меня есть веб-приложение, которое использует несколько служб WCF. Я развертываю свое веб-приложение в различных средах (dev, UAT, производство и т. Д.). URL-адрес каждой службы WCF отличается для каждой среды. Я использую .NET 3.5 и basicHttpBinding s

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

System.ServiceModel.Channels.Binding binding,
System.ServiceModel.EndpointAddress remoteAddress

По сути, конфигурация <system.serviceModel><bindings><basicHttpBinding><binding> в web.config была реплицирована в коде C #.

Этот подход хорошо работает.

Однако теперь мне нужно усовершенствовать этот подход для работы со службой WCF, которая использует сертификат X509. Это означает, что я должен повторить следующие дополнительные настройки в файле web.config в коде C #:

<!-- inside the binding section -->
<security mode="Message">
  <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
  <message clientCredentialType="Certificate" algorithmSuite="Default" />
</security>


<behaviors>
  <endpointBehaviors>
    <behavior name="MyServiceBehaviour">
      <clientCredentials>
        <clientCertificate storeLocation="LocalMachine" storeName="My"
          x509FindType="FindByThumbprint" findValue="1234abcd" />
        <serviceCertificate>
          <defaultCertificate storeLocation="LocalMachine" storeName="My"
            x509FindType="FindByThumbprint" findValue="5678efgh" />
          <authentication trustedStoreLocation="LocalMachine"
            certificateValidationMode="None" />
        </serviceCertificate>
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
</behaviors>

У меня возникают трудности с выяснением того, как кодировать эту конфигурацию в C #.

Два вопроса

  • Кто-нибудь может порекомендовать лучший подход для управления ссылочными URL-адресами служб WCF в нескольких средах?
  • В качестве альтернативы будут приветствоваться любые предложения по репликации вышеуказанного раздела web.config в C #

Ответы [ 3 ]

4 голосов
/ 28 апреля 2009

Один из возможных подходов состоит в том, чтобы «экспортировать» определенные части вашей конфигурации во внешние файлы, по одному на среду.

например. у нас есть «bindings.dev.config» и «bindings.test.config», на которые мы затем ссылаемся в нашем основном файле web.config, например:

<system.serviceModel>
  <bindings configSource="bindings.dev.config" />
</system.serviceModel>

Таким образом, все, что вам нужно для перехода с DEV на PROD, - это одна строка XML-конфигурации.

По сути, в конфигурации .NET 2.0 любой элемент конфигурации может быть «выведен». Однако вы не можете напрямую экспортировать configGroups (например, «system.serviceModel») - вы должны быть на уровне «элемента конфигурации».

Марк

РЕДАКТИРОВАТЬ: ОК, поэтому НЕТ изменения конфигурации config для переключения между средами ..... В этом случае вам, вероятно, придется придумать схему именования, например, Назовите свои привязки, поведение и конечные точки таким образом, чтобы вы могли различать их во время выполнения.

Что-то вроде:

<bindings>
  <binding name="Default_DEV">
    .....
  </binding>
  <binding name="Default_PROD">
    .....
  </binding>
</bindings>

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

1 голос
/ 30 апреля 2009

Следующий код повторяет конфигурацию в моем исходном вопросе:

myClient.ClientCredentials.ClientCertificate.SetCertificate(
    StoreLocation.LocalMachine,
    StoreName.My,
    X509FindType.FindByThumbprint,
    "1234abcd");

myClient.ClientCredentials.ServiceCertificate.SetDefaultCertificate(
    StoreLocation.LocalMachine,
    StoreName.My,
    X509FindType.FindByThumbprint,
    "5678efgh");

myClient.ClientCredentials.ServiceCertificate.Authentication.TrustedStoreLocation = StoreLocation.LocalMachine;
myClient.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;

В рабочем коде два значения отпечатка сохраняются в appSettings в файле web.config.

1 голос
/ 28 апреля 2009

Мы вообще не используем файлы web.config, мы указываем все программно и загружаем всю конфигурацию из централизованной базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...