我有几个通过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的datacontract命名空间。
对于MyComplexType,奇怪的是如果我将其Datacontract-namespace更改为我的服务,服务器和绑定所使用的相同命名空间,那么error(2)就会消失。我无法弄清楚原因。
我要问的问题归结为两个问题:
1)如何将外部模式的import指令添加到我的WSDL中?我在网上看到了一些建议围绕容器编写包装类的解决方案。这是我真的想避免的。
2)我是否真的必须将所有数据交换放入单个命名空间?我没有任何技术上的反对意见,但修改所有数据交换的名称空间将非常麻烦。也许有一种实现这一目标的自动化方式?
TIA!
答案 0 :(得分:0)
所以,以防其他人因从Flex客户端访问WCF(BasicHttpBinding)服务器而遇到同样的问题:
1)不,所有DataContracts都不需要在同一名称空间中(但所有ServiceContracts,服务实现和绑定 do 必须位于同一名称空间中!)。
2)问题的关键在于Flex希望每个xsd:schema对于它引用的所有命名空间都有一个“xsd:import namespace”。此导入应采用以下形式:
<xsd:import namespace="http://schemas.datacontract.org/2004/07/SomeNamespace" />
似乎没有办法用WCF执行此操作,因为它会自动向此标记添加自动生成的schemaLocation属性,这使Flex尝试获取此schemaLocation。唯一的解决方法似乎是在XML级别手动操作WSDL(例如,通过公开REST端点来检索元数据)。
感谢Yaron Naveh在MSDN WCF论坛上的帮助。讨论可以在http://social.msdn.microsoft.com/Forums/en/wcf/thread/b9429e30-e4d5-454f-9fbd-bae39990ff33找到。