Могут ли несколько файлов web.config (в подкаталогах) ссылаться на корневой код? - PullRequest
1 голос
/ 05 декабря 2011

Я чувствую, что есть действительно очевидный ответ на этот вопрос, но мой Google-фу оказывается слишком слабым, чтобы найти его.

У меня есть приложение .NET на единственном тестовом сервере / в окружении, APPSVR, ради аргумента. Веб-сервисы, вызываемые этим приложением, находятся в четырех различных средах (SVC1, SVC2 и т. Д.). Каждый месяц я получаю электронное письмо от QA с просьбой указать приложению правильную среду служб для тестирования в этом месяце. Это 15-секундный процесс (изменение файла web.config для приложения ниже), но он раздражает меня и мешает им выполнять свою работу, пока я не увижу электронное письмо и не выполню его.

<applicationSettings>
  <CM_MVC.Properties.Settings>
    <setting name="CM_MVC_CmsService_cms_webservice" serializeAs="String">
      <value>http://SVC1/cms-webservice/cms-webservice</value>
    </setting>
  </CM_MVC.Properties.Settings>
 </applicationSettings>

Я хочу настроить все так, чтобы они могли перейти на http://APPSVR/app/SVC#, чтобы приложение указывало на правильную среду служб. В идеале, однако, я бы предпочел не публиковать все приложение в четырех разных каталогах каждый раз, когда мы вносим изменения (что нечасто, но все же ...).

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

Есть ли способ, чтобы файл web.config в поддиректории ссылался на корневой код приложения?

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

Ответы [ 2 ]

0 голосов
/ 06 декабря 2011

Если я правильно понимаю, я думаю, что вам просто нужно написать некоторый код для определения URL-адреса на основе некоторого свойства ... сейчас мы скажем строку запроса, хотя вам может потребоваться более безопасный метод.

Я бы:

  1. Добавить новую настройку в конфигурацию
  2. Добавить настройку в файл настроек
  3. Переименовать существующую веб-службу
  4. Замените переименованный веб-сервис на старое имя
  5. Напишите некоторый код для переключения URL.

  1. Добавьте настройку вКонфигурация: http://SVC1/cms-webservice/cms-webservice http://SVC1/cms-webservice/cms-test-webservice

  2. Добавить новую настройку в ваш проект / Свойства / Settings.settings файл

  3. Переименовать класссгенерированный Visual Studio, выделив его в Solution Explorer, нажав F2 и присвоив ему другое имя, например CmsWebServiceBase

  4. Теперь переопределите класс веб-службы, созданный Visual Studio:

    public class CmsWebService : CmsWebServiceBase{
    }
    
  5. Логика переключения кода в конструкторе:

    public CmsWebService(){
        // figure out if we should use Test or Live
        if( HttpContext.Current != null ){
            if( HttpContext.Current.Request.QueryString["test"] == "true" ){
                HttpContext.Current.Session["test"] = "true";
            }
            if( HttpContext.Current.Session["test"] == "true" ){
                this.Url = MyProject.Properties.Settings.CM_MVC_CmsService_cms_webservice_test;
            }
        }
    }
    

Обратите внимание, что это вызовет проблемы, если вы выполняете асинхронную обработку или что-либо ещееще интересно, где вы используете WebService, но Session недоступен.

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

0 голосов
/ 06 декабря 2011

Есть несколько решений.

1) использовать файловый сервер с одинаковыми именами во всех средах и сохранять там настройки приложения. Для этого необходимо, чтобы в каждой среде были записи DNS, указывающие на отдельные файловые серверы.

2) на самом деле вы можете просто назвать службу с таким же именем и снова использовать dns для маршрутизации между средами

3) вы можете развернуть эту часть настроек приложения в каждой среде один раз и прекратить ее развертывание как часть решения каждый раз, когда вам нужно выпустить

4) вы можете использовать комбинацию пользовательского кода и / или configSource = "c: \ ..."

Я не совсем уверен, что вы подразумеваете под ссылкой на корневой код приложения.

...