如何移除MessageHeader生成的外层Security根元素
解决MessageHeader自动生成重复外层Security节点的问题
问题原因
你当前的代码会生成嵌套的Security节点,根源在于:
- 你构造的
el本身就是完整的<wsse:Security>节点 - 调用
MessageHeader.CreateHeader("Security", "wsse", el)时,方法会额外生成一个外层<Security xmlns="wsse">节点,将你的el作为子元素嵌入,导致重复嵌套
解决方案
核心做两个调整:
- 不要传递完整的Security节点作为Header内容,而是传递它的子节点(即UsernameToken)
CreateHeader的命名空间参数要传完整URI,不是前缀"wsse"
方法一:从现有Security节点提取子元素
var el = XElement.Parse("<wsse:Security xmlns:wsse='http://schemas.xmlsoap.org/ws/2002/07/secext'>" + "<wsse:UsernameToken xmlns:wsu='http://schemas.xmlsoap.org/ws/2002/07/utility'>" + "<wsse:Username>TEST</wsse:Username>" + "<wsse:Password Type='wsse:PasswordText'>TEST1</wsse:Password>" + "</wsse:UsernameToken>" + "</wsse:Security>"); // 提取Security节点的所有子节点作为Header内容 var headerContent = el.Nodes(); // 传入完整的命名空间URI,而非前缀 request.Headers.Add(MessageHeader.CreateHeader( "Security", "http://schemas.xmlsoap.org/ws/2002/07/secext", headerContent));
方法二:直接构造UsernameToken节点(更简洁)
跳过外层Security节点的构造,直接传入UsernameToken:
var usernameTokenEl = XElement.Parse("<wsse:UsernameToken xmlns:wsse='http://schemas.xmlsoap.org/ws/2002/07/secext' xmlns:wsu='http://schemas.xmlsoap.org/ws/2002/07/utility'>" + "<wsse:Username>TEST</wsse:Username>" + "<wsse:Password Type='wsse:PasswordText'>TEST1</wsse:Password>" + "</wsse:UsernameToken>"); request.Headers.Add(MessageHeader.CreateHeader( "Security", "http://schemas.xmlsoap.org/ws/2002/07/secext", usernameTokenEl));
最终生成的正确结构
调整后,请求头会生成单个Security节点,不再嵌套:
<wsse:Security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/07/secext"> <wsse:UsernameToken xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility"> <wsse:Username>TEST</wsse:Username> <wsse:Password Type="wsse:PasswordText">TEST1</wsse:Password> </wsse:UsernameToken> </wsse:Security>
内容的提问来源于stack exchange,提问作者FrenkyB
相关产品推荐
相关产品推荐

