AppHarbor自定义配置文件转换

时间:2013-04-23 21:44:08

标签: appharbor web-config-transform

我有一个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>

结果应该用***********。com版本替换服务提供者AssertionConsumerServiceUrl中的localhost url,但它不会

<?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 addin / nuget包在本地和我们的暂存环境中处理转换。

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

  

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

我认为AppHarbor可以在没有SlowCheetah的情况下完成此操作。但同样,WebConfigTransformTester工具不会应用此转换。

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

修改

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

我的配置:

enter image description here

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环境:

enter image description here

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

修改

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

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

修改

从AppHarbor家伙那里听到回复并且转换发生在实际发布上,所以即使构建有“已发布的网站”文件夹,它仍然不是发布操作的最终输出。

谢谢, 乔

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

快来找出,关于转换未发生的原始问题的答案,是因为配置文件的根节点中的xmlns属性。

不幸的是,http://webconfigtransformationtester.apphb.com/并未提供有关转换未进行的原因的任何信息,但如果您查看代码,则可以看到有可用的记录器,但它正在设为null。

我最终拉出代码并添加了一个记录器,并发现警告“源文档中没有元素匹配'/ SAMLConfiguration'”。进一步挖掘我发现这篇文章Why does this web.config transform say it can't find the applicationSettings element?在Sayed的回答中他说过旧的MSBuild Transformation Tasks不支持xmlns属性。

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

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

因此,在AppHarbor更新其转换程序集以使用MSBuild v11.0程序集之前,我几乎陷入困境。