Как сделать так, чтобы перезапись URL работала с преобразованием web.Release.config?

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

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true"/>

    <rewrite></rewrite>
</system.webServer>

И вот преобразование делается:

  <system.webServer>
<rewrite>
  <rules>
    <rule name="Redirect HTTP to HTTPS" stopProcessing="true">
      <match url="(.*)"/>
      <conditions>
        <add input="{HTTPS}" pattern="^OFF$"/>
      </conditions>
      <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther"/>
    </rule>
  </rules>
</rewrite></system.webServer>

Если я просто скопирую правило перезаписи в файл web.config, оно будет работать нормально. У кого-нибудь есть идеи, почему преобразования web.Release.config не работают только для этого раздела?

4 ответа

Решение

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

<system.webServer xdt:Transform="Replace">
    <!-- the rest of your element goes here -->
</system.webServer>

Это скажет двигателю трансформации, что весь system.webServer элемент из Web.config должен быть заменен одним из Web.Release.config,

Механизм трансформации будет молча игнорировать любые элементы, которые не имеют xdt атрибутов.

Обязательная ссылка на MSDN.

Другим способом было бы поставить условие перезаписи, которое сводит на нет, если вы находитесь на localhost:

<conditions>
    <add input="{HTTP_HOST}" pattern="localhost" negate="true"/>
</conditions>
<system.webServer>
    <rewrite>
        <rules xdt:Transform="Replace">
            <clear />
            <rule name="Redirect HTTP to HTTPS" stopProcessing="true">
              <match url="(.*)" />
              <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                <add input="{HTTP_HOST}" pattern="localhost(:\d+)?" negate="true" />
                <add input="{HTTP_HOST}" pattern="127\.0\.0\.1(:\d+)?" negate="true" />
                <add input="{HTTPS}" pattern="OFF" />
              </conditions>
              <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther" />
            </rule>
        </rules>          
    </rewrite>
</system.webServer>

Подводя итог другим ответам здесь, мы обнаружили очевидное: "Заменить" заменит только узел, а не "Вставить" его (спасибо DigitalD за правильный путь). В остальных наших файлах преобразования используется replace, поэтому мы выбрали пустой тег в нашем базовом файле web.config (тот, который преобразуется).

<system.webServer>
...other tags here that do not get transformed...
<rewrite />
</system.webServer>

В идеале было бы "Перезаписать", что бы вставить или заменить (или удалить и вставить).

Другие вопросы по тегам