【问题标题】:Failing web.config transform when no value exists for a transform当转换不存在值时,web.config 转换失败
【发布时间】:2012-03-15 16:19:52
【问题描述】:

我们今天发生了一件让我思考的事情。我们有一个项目,其中包含用于各种配置的非常标准的 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 项,则转换(以及因此部署)失败会很好。

所以我是在征求人们的意见,这是有用的吗?是不是有点矫枉过正?我完全没有抓住重点吗?

另外,有什么东西可以做到这一点吗?我很高兴挖掘并开发解决方案,但如果有人为我完成了这些工作,我会更高兴;)

【问题讨论】:

  • 不知道任何会导致异常的事情,但可能有用。可能只想尝试将主 web.config 中的值留空,如果它没有得到转换,您将很快在应用程序中收到错误。没有那么有用,但可以防止任何无意的 PROD 访问。
  • 这样做的问题是,如果不添加值,您将无法在本地进行调试,当开发人员忘记再次取出该值时,这会使我们回到最初的问题......跨度>

标签: c# msbuild web-config


【解决方案1】:

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

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

无论如何,我绝对认为至少有一个选项可以设置发布失败的位置或在转换无效时向您发出警告。

【讨论】:

  • Brill,这正是我一直在寻找的东西,我会在接下来的几周内尝试将一些东西放在一起并发布在 github 上。 (顺便说一句,在没有互联网的假期中回复迟到了!)
猜你喜欢
  • 2013-02-18
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 2013-12-30
  • 2023-03-31
  • 2019-08-12
  • 2018-02-28
相关资源
最近更新 更多