当转换不存在值时,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项,那么如果转换(以及部署)失败,那就太好了。

所以我有点想听听人们的意见,这会有用吗?这是不是太夸张了?我是不是完全没有抓住要点?

还有,有什么能做到这一点吗?我很乐意深入研究并制定解决方案,但如果有人帮我跑腿,我会更高兴;)

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

事实上,我自己测试过这个,并且能够在发布过程中抛出异常。然而,我的自定义定位器类(MyMatch)除了抛出异常之外,实际上什么也没做。重写方法以模仿Match类(不能从中继承),然后找出合适的位置来进行最后的匹配失败检查,这可能是一项相当艰巨的工作。

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

最新更新