我有一个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。
我的配置:
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,它仍然在“开发”处设置了环境。
修改
我向我的一个控制器添加了一个Action,它读取环境AppSetting并输出到视图,令我惊讶的是它是“Release”!!!
那是什么给出的? “下载构建”内容没有适当的转换,但是当请求发生时它会发生吗? AppHarbor什么时候应用转型?它是在运行时而不是在构建期间吗?
修改
从AppHarbor家伙那里听到回复并且转换发生在实际发布上,所以即使构建有“已发布的网站”文件夹,它仍然不是发布操作的最终输出。
谢谢, 乔
答案 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程序集之前,我几乎陷入困境。