【问题标题】:AppHarbor custom config file transformationsAppHarbor 自定义配置文件转换
【发布时间】:2013-04-23 21:44:08
【问题描述】:

我有一个包含一些 saml 信息的 xml 文件 saml.config。该信息需要在发布版本中进行转换,以包含生产 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>

结果应该将服务提供者 AssertionConsumerServiceUrl 中的 localhost url 替换为 *************.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>

为什么转换测试器没有应用转换?

编辑:

我应该补充一点,我使用 SlowCheetah 插件/nuget 包在本地和我们的暂存环境中处理转换。

考虑到文档 (http://support.appharbor.com/kb/getting-started/managing-environments) 状态

所有具有相应 .release.config 文件的 .config 文件都支持配置文件转换。

我假设 AppHarbor 可以在没有 SlowCheetah 的情况下做到这一点。但同样,WebConfigTransformTester 工具不应用此转换。

所以问题仍然存在,我该如何应用这种转换?我可以在 AppHarbor 中使用 SlowCheetah 吗?

编辑:

经过进一步调查,AppHarbor 似乎也没有将转换应用于 Web.Config。

我的配置:

Web.Config 中的 AppSettings

<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>

请注意,环境正在替换为“发布”

AppHarbor 环境:

部署到 AppHarbor 后,我下载了构建并检查了 Web.Config,它仍然在“开发”处具有环境设置。

编辑:

我向我的一个控制器添加了一个动作,它读取环境 AppSetting 并输出到视图,令我惊讶的是它是“释放”!!!

那么什么给了? “下载构建”内容没有适当的转换,但是当请求发生时呢? AppHarbor 何时应用转换?它是在运行时而不是在构建期间吗?

编辑:

从 AppHarbor 人员那里得知,转换发生在实际发布时,因此即使构建有一个“Published Websites”文件夹,它仍然不是发布操作的最终输出。

谢谢, 乔

【问题讨论】:

    标签: appharbor web-config-transform


    【解决方案1】:

    我们刚刚针对此问题推出了解决方案(使用您指出的最新转换程序集)并相应地更新了http://webconfigtransformationtester.apphb.com/。现在应该可以按预期应用您的转换了。

    感谢您对此问题的彻底调查。

    【讨论】:

      【解决方案2】:

      来看看,我原来的问题的答案是没有发生转换,是因为配置文件根节点中的 xmlns 属性。

      不幸的是,http://webconfigtransformationtester.apphb.com/ 没有提供任何关于为什么没有发生转换的信息,但是如果你查看代码,你可以看到有一个可用的记录器,但它被设置为无效的。

      我最终提取了代码并添加了一个记录器,发现一个警告“源文档中没有元素匹配'/SAMLConfiguration'”。再深入一点,我发现这篇帖子 Why does this web.config transform say it can't find the applicationSettings element? 在 Sayed 的回答中说,旧的 MSBuild 转换任务不支持 xmlns 属性。

      从配置文件和转换文件中删除 xmlns 属性应该可以解决问题。

      但是,在我的情况下,xmlns 属性是必需的,并且无法删除。

      所以在 AppHarbor 更新他们的转换程序集以使用 MSBuild v11.0 程序集之前,我几乎被困住了。

      【讨论】:

        猜你喜欢
        • 2012-09-20
        • 2012-02-16
        • 2016-04-16
        • 2012-01-11
        • 2015-05-09
        • 2011-06-17
        • 1970-01-01
        • 2016-03-27
        • 1970-01-01
        相关资源
        最近更新 更多