ASP.NET WCF web.config转换时diagnostics下add元素命名空间丢失如何解决
WCF配置转换丢失命名空间声明问题解决方案
根本原因
Web.config 转换引擎仅会检测XML结构层面的命名空间使用情况,不会解析节点文本内容中的命名空间前缀,因此会将add元素上定义的s、a命名空间判定为未使用的冗余声明,在转换过程中自动剔除,导致最终配置的XPath表达式找不到对应命名空间,出现XML格式错误。
解决方法
方法1:添加伪属性标记命名空间已使用(最简便)
在add节点上新增两个对应命名空间前缀的无用属性,让转换引擎识别到命名空间已被使用,不会自动剔除。WCF读取过滤规则时仅会读取add节点的文本内容,额外的伪属性不会影响服务运行。
转换规则写法如下:
<diagnostics performanceCounters="All" xdt:Transform="Replace"> <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="300000" maxSizeOfMessageToLog="200000000"> <filters> <add xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" s:keepNs="1" a:keepNs="1">/s:Envelope/s:Header/a:Action[contains(.,'IMyService')]</add> </filters> </messageLogging> </diagnostics>
方法2:使用CDATA包裹过滤表达式
将XPath过滤表达式用CDATA段包裹,同时将命名空间声明移到上层的diagnostics节点,转换后命名空间会保留在diagnostics节点上,XML解析时可正常识别文本中的前缀:
<diagnostics performanceCounters="All" xdt:Transform="Replace" xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="300000" maxSizeOfMessageToLog="200000000"> <filters> <add><![CDATA[/s:Envelope/s:Header/a:Action[contains(.,'IMyService')]]></add> </filters> </messageLogging> </diagnostics>
方法3:自定义MSBuild任务替换节点
如果以上两种方法不符合你的使用场景,可以在项目的构建流程中添加自定义MSBuild任务,直接将完整的diagnostics节点写入最终生成的web.config,绕开默认的配置转换逻辑。
内容的提问来源于stack exchange,提问作者user729400
相关产品推荐
相关产品推荐

