我们有一个SOAP服务,它为整个内容指定命名空间,但不指定列表中的底层类型。结果是消息可以被映射(使用好的、旧的WSDL(,但由于映射失败,该响应中的列表变为空(尽管读取了项(。
WSDL包含了所有应该包含的定义。第一个xmlns值也是正确的(根据自动创建的代理客户端引用进行验证(。这只是第二个xmlns定义中的一个小故障,因为它是空的。因此,虽然FindUsersByUserIdResponse是类型声明的,但users不是。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<FindUsersByUserIdResponse xmlns="uri:wspisa.ams.se">
<users xmlns="">
<user>
<userId>197602081116</userId>
<globalAttributes/>
<applicationAttributes/>
</user>
</users>
</FindUsersByUserIdResponse>
</soapenv:Body>
</soapenv:Envelope>
负责上述服务的人很久以前就走了。逻辑的复杂性使得重构工作流程变得困难。我最好的办法是以纯文本的形式阅读信封的全部内容,并开始手动解析。然而,这与地球上一切美好的事物都背道而驰。
我在谷歌上搜索过,没有发现任何更有用的东西,在开始编写手动和自定义XML映射的糟糕代码之前,我想知道是否有更快的方法。也许可以通过更改Reference.cs文件中的属性名称空间来指出SOAP信封中的名称空间。
如果服务器端发送的响应与约定(wsdl(不匹配,并且无法修复,则可以决定在客户端单方面更改约定,并将其导入到代码中。如果您更新约定,使定义的响应与消息的实际输出相匹配,那么您将获得数据。
如果由于复杂的结构和导入而很难做到这一点,那么您还可以决定更改响应约定以接受xsd:any元素,该元素基本上允许该部分下面的任何语法正确的xml。无论内容如何,这都会向您发送消息。然后,您可以获取该部分,手动在消息上设置正确的命名空间,并根据正确的数据结构对其进行验证。