2012-03-15 59 views
6

今天发生了一些事情,让我想到了这一点。我们有一个项目,它为我们的各种配置提供了一个非常标准的web.config变换设置。这里是控制我们的DAO接入服务部分,看起来像这样:当变换值不存在时发生web.config变形失败

<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项,则转换(因此部署)失败将会很好。

因此,我对人们的观点进行了一些调整,这是否会有用?这是纯粹的矫枉过正?我完全错过了这一点吗?

此外,有没有什么这样做?我很高兴挖掘和开发一个解决方案,但如果有人为我做了修改,我会更高兴;)

+0

不知道会引起异常的任何事情,尽管可能有用。可能只想在主web.config中留下空白值,如果它没有被转换,你很快就会在应用程序中出错。没有帮助,但可以防止任何意外的PROD访问。 – dbugger 2012-03-15 23:04:25

+0

这样做的问题是,如果不添加值,则无法在本地进行调试,这会使我们回到原始问题,当开发人员忘记再次取出该值时... – 2012-03-28 09:12:48

回答

1

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

我自己实际测试过这一点,并能在发布期间抛出异常。但是,我的自定义定位器类(MyMatch)除了抛出异常外,实际上并没有做任何事情。覆盖方法来模拟Match类(您不能从中继承),然后找出合适的位置对失败进行最终检查,这可能是相当不错的工作。

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

+0

布里尔,这只是一种我正在寻找的东西,我会尝试并在未来几周内将它们放在一起并发布到github上。 (对于迟到的答复,顺便说一句,没有互联网的休假!) – 2012-03-28 09:14:13

相关问题