【发布时间】:2010-12-30 11:31:19
【问题描述】:
我有几个通过 WCF 公开的服务合同,它们使用多个数据合同。该服务将由 Adobe Flex 使用。我在让 Flex 使用服务器生成的 WSDL 时遇到了很多问题。我使用here 概述的过程将 WSDL 压缩到一个文件中(如果重要的话,我使用的是 FlatWsdl 而不是 WcfExtras)。
现在我在使用 VS2010 自己的 wsdl.exe 工具提取我的元数据时遇到了一堆错误。具体来说,我收到以下错误:
1) Schema validation warning: Schema item 'complexType' named
'ArrayOfKeyValueOfSomeKeySomeValuep1alXzIb' from namespace
'http://schemas.microsoft.com/2003/10/Serialization/Arrays' is invalid.
Namespace 'http://My/Wcf/Namespace' is not available to be referenced
in this schema.
2) Schema validation warning: Schema item 'complexType' named 'MyComplexType'
from namespace 'http://My/Wcf/Namespace' is invalid. Namespace
'http://schemas.datacontract.org/2004/07/My.Real.Namespace' is not available
to be referenced in this schema.
现在,Dictionary ("ArrayOfKeyValueOf...") 类型显然是在外部模式中定义的,我的 WSDL 没有导入该模式。请注意,SomeKey 和 SomeValue 的数据协定命名空间为 My/Wcf/Namespace。
对于 MyComplexType,奇怪的是,如果我将其 Datacontract-namespace 更改为我的服务、服务器和绑定使用的相同命名空间,那么错误 (2) 就会消失。我不知道为什么。
我要问的问题归结为两个问题:
1) 如何将外部模式的导入指令添加到我的 WSDL?我在网上看到一些解决方案,建议围绕容器编写一个包装类。这是我非常想避免的事情。
2) 我真的必须将我所有的数据合约放到一个命名空间中吗?我对这样做没有任何技术上的反对意见,但是修改所有数据合同的命名空间会非常麻烦。也许有一种自动化的方式来实现这一点?
TIA!
【问题讨论】:
-
这不会回答您的问题,但如果这些服务仅设计用于与 Adobe Flex 一起使用,我强烈建议从 WebServices 切换到使用 WebORB 或 FlourineFX 的 AMF 协议。除此之外,您是否使用过 ServiceCapture 之类的工具来确定来回发送哪些数据?使用服务的你的 Flex 代码是什么?
-
我想这是一种方法,但它需要重新设计。您会看到,这些服务最初是要与 C# 一起使用的,直到最近我们才转向 Flex。此外,我们希望以标准方式公开我们的服务,以允许第三方开发人员与它们进行交互。
-
我没用过抓包工具。你希望在那里看到什么?我知道 WSDL 的样子,而 wsdl.exe 声称它已损坏。您认为通过嗅探电线可以获得任何进一步的见解吗?至于我们如何使用 flex 中的服务:我们想使用 Flex 的“webservice introspection”能力。换句话说 - 我们希望将服务作为普通的 Web 服务来使用。
标签: apache-flex wcf wsdl