【发布时间】:2011-01-11 19:52:33
【问题描述】:
我针对使用 XmlSerializer 序列化程序的预先存在的 XSD 架构构建了 WCF Web 服务。
我想根据这个预先存在的架构验证传入请求和传出请求。 MSDN 包含一个工作示例,说明如何使用 WCF MessageInspectors 完成此操作。所描述的技术涉及在正文内容处创建一个XmlReader:
XmlReader bodyReader = message.GetReaderAtBodyContents().ReadSubtree();
然后使用来自该阅读器的XMLDictionaryReader 创建对SchemaSet 进行验证。
我遇到了一个问题,即我的 xml 正文内容包含多个针对元素的 xsi:type="xsd:string" 实例。 xsi 和 xsd 的命名空间前缀是由 WCF 针对 body 元素生成的,因此由于未声明 xsd,我的验证失败。
示例 XML 消息:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://www.abc.com/Service/Response</Action>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<foo xmlns="http://www.abc.com">
<aaa xsi:type="xsd:string">true</aaa>
</foo>
</s:Body>
</s:Envelope>
验证错误:
"The value 'xsd:string' is invalid according to its schema type 'QName' - 'xsd' is an undeclared namespace."
是否有任何 WCF 配置选项允许我将这些 xmlns 声明下推到正文中?
【问题讨论】:
-
??? 标签上定义的 XML 命名空间 ARE .....
-
xml 命名空间是在 标签上定义的,但是被验证的 xml 是 body 标签下的子树
-
我不知道有什么方法可以将这些命名空间向下“移动” - 你不能更改验证以包含 标记吗?可能是最简单的方法......
标签: .net wcf web-services validation xsd