Подтвердить что ты не робот

Преобразование Web.config Build vs не работает

У меня есть проект веб-приложения ASP.NET, который подключается к удаленной базе данных через Entity Framework. Во время отладки (например, при запуске проекта на моем локальном компьютере) IP-адрес в базе данных отличается от во время выпуска (например, после загрузки проекта на мой веб-сервер и запуска его из браузера). До сих пор я всегда вручную изменял строку подключения к базе данных в файле Web.config, чтобы переключаться между двумя (в основном мне приходилось использовать строки подключения, одну с именем "Debug" и одну "Release"), и я просто обменивался именами при каждом развертывании).

Теперь я только что заметил, что можно позволить этому происходить автоматически с помощью синтаксиса преобразования Web.config, где вы помещаете измененную строку подключения в версию Web.Release.config, и она должна затем использовать ее при сборке библиотеки DLL в конфигурации выпуска,

Однако это не похоже на работу для меня...

Вот соответствующая часть моего обычного файла Web.config (который содержит строку подключения Debug для локального использования):

<?xml version="1.0"?>
<configuration>

  <connectionStrings>
    <!-- Debug connection string. Release connection string is in Web.Release.config file -->
    <add name="DatabaseEntities" connectionString="A" providerName="System.Data.EntityClient" />
  </connectionStrings>

</configuration>

Вот файл Web.Release.config, который в соответствии с примерами должен заменить строку подключения "DatabaseEntities" "A" на "B", если DLL находится в режиме Release:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

  <!-- Replace the DatabaseEntities connection string with the Release version (local IP address) -->
  <connectionStrings>
    <add name="DatabaseEntities"
      connectionString="B"
      xdt:Transform="Replace" xdt:Locator="Match(name)"/>
  </connectionStrings>

</configuration>

(Очевидно, "A" и "B" - просто заполнители для моих реальных строк соединения)

Когда я отлаживаю приложение (например, просто нажимаю F5), по умолчанию используется Web.config, и я могу получить доступ к базе данных. Затем я изменяю конфигурацию сборки на Release через Configuration Manager. Все проекты в решении настроены на выпуск конфигурации. Затем я строю решение (просто через Build или даже через полную перестройку (например, Clean, Rebuild)). Я загружаю недавно созданные библиотеки DLL на веб-сервер, а также файлы Web.config и Web.Release.config, и когда я пытаюсь получить доступ к базе данных, я не могу, она все еще пытается получить доступ к базе данных через IP-адрес отладки. и, следовательно, не может найти его...

Кажется, файл Web.Release.config полностью игнорируется или, по крайней мере, строка подключения не заменяется.

Что я делаю неправильно? Является ли синтаксис преобразования неправильным? Я правильно не собираю приложение в режиме Release?

4b9b3361

Ответ 1

Затем я создаю решение (просто через Build или даже через полный перестроить (например, очистить, перестроить)). Я загружаю недавно созданные библиотеки DLL веб-сервер, а также файлы Web.config и Web.Release.config

Возникла ваша ошибка: преобразования веб-конфигурации не будут работать для вашей локальной среды, если вы просто создадите. Вам нужно опубликовать.

Процесс развертывания кажется странным: вы копируете только DLL, Web.config и web.Release.config. Мне кажется, что вы копируете исходный код, а не компилируемое приложение. Опубликованная WebApplication не содержит web.release.config.

Вы должны опубликовать свой проект (rightclick on the WebApplication → Publish) в свою локальную файловую систему и скопировать туда файлы или использовать другой способ развертывания по вашему выбору.

2 года назад я написал статью о преобразованиях web.config. Он дает пошаговое руководство для VS 2010 (диалог публикации опубликован в VS 2012): http://www.tomot.de/en-us/article/5/asp.net/how-to-use-web.config-transforms-to-replace-appsettings-and-connectionstrings

Ответ 2

Вы можете попробовать плагин Slow Cheetah:

http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5

Это позволит вам увидеть трансляции "живые", предоставив вам дополнительный параметр контекстного меню. Щелкните правой кнопкой мыши и выберите Preview Transform, чтобы увидеть преобразование без необходимости сборки. Его также очень удобно для реализации преобразований app.config

Ответ 3

Я думал, что преобразование выполняется только при публикации сайта/приложения. Это не делается при создании приложения. Последний постоянно менял web.config под контролем источника (что было бы настоящей проблемой)

Ответ 4

Если это только строки соединений, которые не перезаписываются при преобразовании web.config, то это то, что я сделал: Я очистил флажок "Использовать эту строку соединения во время выполнения" в разделе "Настройки" мастера "Опубликовать в Интернете". Этот параметр переписывал преобразование web.config строки подключения.

Ответ 5

Внутри вашего файла csproj вы можете добавить действие, которое будет выполняться перед каждой сборкой, и выполнить преобразования web.config:

<Target Name="BeforeBuild">
    <TransformXml Source="web.config" Transform="web.$(Configuration).config" Destination="web.config" />
</Target>

Ответ 6

Это довольно гибкий, вы должны быть в состоянии сделать несколько настроек для применения пользовательских преобразований при сборке (и без необходимости публиковать)

Мы реализовали это в нашем (Windows Service) проекте, применяя преобразования при сборке

Вам нужно будет изменить файл вашего проекта и добавить что-то похожее на ниже

Здесь мы говорим msbuild применить преобразование после завершения компиляции, но только если условие истинно (см. Https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-conditions?view=vs-2017).

Обратите внимание, что мы используем опору сборки (самостоятельно определенную опцию msbuild) "Env", например, msbuild.../p:Env=Prod приведет к App.Prod.config

<UsingTask TaskName="TransformXml" AssemblyFile="C:\Some\Path\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterCompile" Condition="Exists('some condition')">
  <!--Generate transformed app config in the intermediate directory-->
  <TransformXml Source="App.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="App.$(Env).config" />
  <!--Force build process to use the transformed configuration file from now on.-->
  <ItemGroup>
    <AppConfigWithTargetPath Remove="App.config" />
    <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
      <TargetPath>$(TargetFileName).config</TargetPath>
    </AppConfigWithTargetPath>
  </ItemGroup>
</Target>

Ответ 7

Чтобы преобразование работало в разработке (используя F5 или CTRL + F5), попробуйте это расширение:

https://github.com/Microsoft/slow-cheetah