当没有变换值存在时,web.config转换失败

时间:2012-03-15 16:19:52

标签: c# msbuild web-config

我们今天发生了一件让我思考的事件。我们有一个项目,为我们的各种配置提供了非常标准的web.config转换设置。有一节控制对DAO服务的访问,如下所示:

<endpoint address="http://myserver/myservice1.svc/basicHttp"
binding="basicHttpBinding" contract="MyAssembly.IItem" name="DataAccessEndPoint"
kind="" endpointConfiguration="" />
<endpoint address="http://myserver/myservice2.svc/basicHttp"
binding="basicHttpBinding" contract="MyAssembly.IItem2" name="LoggingEndPoint"
kind="" endpointConfiguration="" />

这样的变换:

<endpoint address="http://mytestserver/myservice1.svc" name="DaoEndPoint" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"  />
<endpoint address="http://mytestserver/myservice2.svc" name="LoggingEndPoint" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"  />

希望您在此处发现错误 - DaoEndPoint的名称不匹配。不幸的是,创建它的开发人员没有,并且也在本地调试实时服务,导致测试部署到,是,指向实时。幸运的是我们很快就把它拿了起来,但我相信你可以在这里看到极度痛苦的可能性!

我在创建转换文件时考虑过你的意图,在我看来,如果你想要转换某些东西的变换。因此,如果在主.config文件中存在DaoEndPoint转换但没有匹配的DaoEndPoint项,则转换(以及部署)失败会很好。

所以我喜欢讨论人们的意见,这有用吗?它显然有点矫枉过正吗?我完全忽略了这一点吗?

此外,还有什么可以做到的吗?我很乐意去挖掘和开发解决方案,但如果有人为我做过腿部工作,我会更高兴;)

1 个答案:

答案 0 :(得分:1)

请参阅Sayed Ibrahim Hashimi对this question的完美答案,其中涉及创建一个继承自Microsoft.Web.Publishing.Tasks.Transform的自定义类。您可以使用相同的技术,但继承自Locator类,然后在无法匹配目标节点时抛出异常。

我实际上自己测试了这个并且能够在发布期间抛出异常。但是,除了抛出异常之外,我的自定义定位器类(MyMatch)实际上并没有做任何事情。重写模拟Match类(你不能继承)的方法可能是一项相当大的工作,然后找出最后检查失败匹配的适当位置。

无论如何,我绝对认为至少有一个选项,你可以设置发布失败的地方,或者当你的转换没有效果时给你一个警告是有用的。