Как заставить перезапись 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 не работают только для этого раздела?


person Matthew Kruskamp    schedule 09.08.2011    source источник
comment
Я бы тоже хотела узнать, что с этим. Преобразование, похоже, ведет себя не так, как должно.   -  person Dusda    schedule 11.08.2011


Ответы (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.

person Lobstrosity    schedule 10.08.2011
comment
Эй, большое спасибо. Я видел несколько примеров, в которых преобразование не указано явно. Это огромное спасение. Я должен лучше проверить документацию в будущем, но я ценю это. - person Matthew Kruskamp; 20.08.2011
comment
Я бы +4654654564324, если бы мог. Некоторое время я задавался вопросом, почему я никогда не мог заставить это работать. Было бы неплохо, если бы механизм трансформации выдавал предупреждение при игнорировании элемента. - person David Murdoch; 26.08.2011
comment
Дополнительное примечание для людей с более сложными файлами. Вы можете поместить элемент xdt:Transform в тег <rewrite> и изменить его на Insert следующим образом: <rewrite xdt:Transform="Insert">, что сохранит любые другие теги в вашем разделе <system.webServer>. - person Michael Dunlap; 19.01.2013
comment
Я ненавижу преобразования web.config. Кто это проектирует. - person John Shedletsky; 11.06.2015
comment
На самом деле web.config трансформации очень гладкие... некоторые люди просто застряли в прошлом... - person Serj Sagan; 30.11.2015
comment
Какую хорошую схему использовать? У меня есть «schemas.microsoft.com/XML-Document-Transform' и VS 2015 говорит мне, что xdt:Transform не объявлен в «правиле» - person Stephane; 02.05.2017
comment
@Stephane выглядит так, как будто схеме нравится Transform в родительском <system.webServer>, но он не ожидает его в <rewrite> или <rules> внизу. Но другие сообщают, что это все равно работает. - person SushiGuy; 24.08.2017

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

<conditions>
    <add input="{HTTP_HOST}" pattern="localhost" negate="true"/>
</conditions>
person citronas    schedule 21.08.2011
comment
Потрясающее решение. Стоит отметить, что если вы используете Chrome — Chrome кэширует перенаправление, поэтому вам может потребоваться очистить кеш: superuser.com/questions/304589/ - person Chris Nevill; 09.08.2016

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

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

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

person BlackjacketMack    schedule 10.09.2013

person    schedule
comment
вы также можете использовать ‹rules xdt:Transform=Insert›, если в вашем файле web.config нет элементов перезаписи. - person Ray Linder; 11.11.2015