AppHarbor преобразования пользовательских файлов конфигурации
У меня есть XML-файл saml.config, который содержит некоторую информацию saml. Эта информация должна быть преобразована в сборки выпуска, чтобы включать производственные URL вместо URL разработки и промежуточных версий. В моей среде разработки и промежуточной трансформации преобразование происходит идеально, в среде релиза преобразование не происходит.
Я пытался http://webconfigtransformationtester.apphb.com/ чтобы проверить преобразования, и они не применяются, но опять же, VS применяет их отлично.
Базовый файл saml.config:
<?xml version="1.0"?>
<SAMLConfiguration xmlns="urn:componentspace:SAML:2.0:configuration">
<ServiceProvider Name="Portal.Web" AssertionConsumerServiceUrl="http://localhost:49462/SingleSignOn/ConsumeAssertion"/>
<PartnerIdentityProvider Name="MTMIdentity"
SignAuthnRequest="false"
WantResponseSigned="false"
WantAssertionSigned="false"
WantAssertionEncrypted="false"
SingleSignOnServiceUrl="https://identity.*********.com/SingleSignOn/"/>
</SAMLConfiguration>
Файл преобразования:
<?xml version="1.0" encoding="utf-8" ?>
<SAMLConfiguration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xmlns="urn:componentspace:SAML:2.0:configuration">
<ServiceProvider Name="Portal.Web" AssertionConsumerServiceUrl="https://***********.com/SingleSignOn/ConsumeAssertion" xdt:Transform="SetAttributes" xdt:Locator="Match(Name)" />
</SAMLConfiguration>
Результат должен заменить локальный URL-адрес в поставщике услуг AssertionConsumerServiceUrl на версию ***********. Com, но это не так
<?xml version="1.0"?>
<SAMLConfiguration xmlns="urn:componentspace:SAML:2.0:configuration">
<ServiceProvider Name="Portal.Web" AssertionConsumerServiceUrl="http://localhost:49462/SingleSignOn/ConsumeAssertion" />
<PartnerIdentityProvider Name="MTMIdentity" SignAuthnRequest="false" WantResponseSigned="false" WantAssertionSigned="false" WantAssertionEncrypted="false" SingleSignOnServiceUrl="https://identity.********.com/SingleSignOn/" />
</SAMLConfiguration>
Почему тестер преобразования не применяет преобразование?
РЕДАКТИРОВАТЬ:
Я должен добавить, что я использую пакет addin / nuget SlowCheetah для обработки преобразования локально и в нашей промежуточной среде.
Учитывая документацию ( http://support.appharbor.com/kb/getting-started/managing-environments) говорится
Преобразование файла конфигурации поддерживается для всех файлов.config, имеющих соответствующий файл.release.config.
Я предполагаю, что AppHarbor может сделать это без SlowCheetah. Но опять же, инструмент WebConfigTransformTester не применяет это преобразование.
Таким образом, вопрос все еще, как я могу применить это преобразование? Могу ли я использовать SlowCheetah в AppHarbor?
РЕДАКТИРОВАТЬ:
После дальнейшего изучения выясняется, что AppHarbor НЕ применяет преобразования и к Web.Config.
Мои Конфиги:
AppSettings в Web.Config
<appSettings>
<add key="webpages:Version" value="2.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="aspnet:UseHostHeaderForRequestUrl" value="true" />
<add key="PreserveLoginUrl" value="true" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="Environment" value="Development" />
</appSettings>
Обратите внимание, что для среды установлено значение "Разработка"
Преобразование релиза:
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="Environment" value="Release" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
</appSettings>
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
<customErrors defaultRedirect="GenericError.htm" mode="Off" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
</system.web>
</configuration>
Обратите внимание, что среда заменяется на "Release"
Окружение AppHarbor:
После развертывания в AppHarbor я загрузил сборку и проверил Web.Config, и он все еще имеет параметр Environment в "Development".
РЕДАКТИРОВАТЬ:
Я добавил Action к одному из моих контроллеров, который считывает набор настроек среды и выводит в представление, и к моему большому удивлению это был "Release"!!!
Так что же дает? Содержимое "Download Build" не имеет преобразования на месте, но когда происходит запрос, это происходит? Когда AppHarbor применяет преобразование? Это во время выполнения, а не во время сборки?
РЕДАКТИРОВАТЬ:
Услышав это от ребят из AppHarbor, трансформация происходит при фактической публикации, поэтому, несмотря на то, что сборка имеет папку "Опубликованные сайты", она по-прежнему не является окончательным результатом действий публикации.
Спасибо джо
2 ответа
Мы только что выпустили решение (используя новейшие сборки трансформации, как вы указали) для этой проблемы и обновили http://webconfigtransformationtester.apphb.com/ соответственно. Ваши преобразования должны быть применены, как ожидается, сейчас.
Спасибо за тщательное расследование этой проблемы.
Приходите, чтобы узнать, ответ на мой первоначальный вопрос о том, как преобразование не происходит, заключается в том, что атрибут xmlns находится в корневом узле файла конфигурации.
К сожалению, http://webconfigtransformationtester.apphb.com/ не дает вам никакой информации о том, почему преобразование не произошло, но если вы посмотрите код, вы увидите, что есть доступный регистратор, но он устанавливается на ноль.
Я закончил тем, что потянул код и добавил регистратор и обнаружил предупреждение "Ни один элемент в исходном документе не соответствует" /SAMLConfiguration "". Копаясь немного дальше, я нашел этот пост. Почему преобразование web.config говорит, что не может найти элемент applicationSettings? что в ответе Сайеда он заявляет, что старые задачи преобразования MSBuild не учитывают атрибут xmlns.
Удаление атрибута xmlns из файла конфигурации и файла преобразования должно решить проблему.
Однако в моем случае атрибут xmlns является обязательным и не может быть удален.
Поэтому до тех пор, пока AppHarbor не обновит свои сборки преобразования для использования сборок MSBuild v11.0, я довольно сильно застрял.