【问题标题】:WCF: Should all datacontracts use the same namespace?WCF:所有数据合同都应该使用相同的命名空间吗?
【发布时间】:2010-12-30 11:31:19
【问题描述】:

我有几个通过 WCF 公开的服务合同,它们使用多个数据合同。该服务将由 Adob​​e 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!

【问题讨论】:

  • 这不会回答您的问题,但如果这些服务仅设计用于与 Adob​​e Flex 一起使用,我强烈建议从 WebServices 切换到使用 WebORB 或 FlourineFX 的 AMF 协议。除此之外,您是否使用过 ServiceCapture 之类的工具来确定来回发送哪些数据?使用服务的你的 Flex 代码是什么?
  • 我想这是一种方法,但它需要重新设计。您会看到,这些服务最初是要与 C# 一起使用的,直到最近我们才转向 Flex。此外,我们希望以标准方式公开我们的服务,以允许第三方开发人员与它们进行交互。
  • 我没用过抓包工具。你希望在那里看到什么?我知道 WSDL 的样子,而 wsdl.exe 声称它已损坏。您认为通过嗅探电线可以获得任何进一步的见解吗?至于我们如何使用 flex 中的服务:我们想使用 Flex 的“webservice introspection”能力。换句话说 - 我们希望将服务作为普通的 Web 服务来使用。

标签: apache-flex wcf wsdl


【解决方案1】:

所以以防万一其他人在从 Flex 客户端访问 WCF (BasicHttpBinding) 服务器时遇到同样的问题:

1) 不,所有 DataContract 不必在同一个命名空间中(但所有 ServiceContract、服务实现和绑定确实必须在同一个命名空间中!)。

2) 问题的症结在于 Flex 期望每个 xsd:schema 对于它引用的所有命名空间都有一个“xsd:import 命名空间”。此导入应采用以下形式:

<xsd:import namespace="http://schemas.datacontract.org/2004/07/SomeNamespace" />

似乎没有办法使用 WCF 执行此操作,因为它会自动将自动生成的 schemaLocation 属性添加到此标记,这使得 Flex 尝试获取此 schemaLocation。唯一的解决方法似乎是在 XML 级别手动操作 WSDL(例如,通过公开 REST 端点来检索元数据)。

感谢 MSDN WCF 论坛中的 Yaron Naveh 提供的帮助。可以在http://social.msdn.microsoft.com/Forums/en/wcf/thread/b9429e30-e4d5-454f-9fbd-bae39990ff33 找到讨论。

【讨论】:

  • 我们在尝试使用 Flex 的 WCF SOAP 服务时遇到了类似的问题。你能澄清一下你的答案吗?您是说这些导入上仅存在 schemaLocation 属性就是导致 Flex 中断的原因?如果没有它,它如何找到引用的模式?
  • @Matti:确实,WCF 添加的 schemaLocation 破坏了 Flex。问题是所有内容都已嵌入 WSDL(您必须使用“平面 WSDL”),因此无需引用任何外部模式。最终我们编写了一个小程序来为我们修改 WSDL(修改导入)。
  • @Matti:澄清上面的“修改导入”:我们所做的是为&lt;wsdl:types&gt; 节点中的每个模式,我们为所有其他模式以及http://schemas.microsoft.com/2003/10/Serialization/ 添加导入、http://schemas.microsoft.com/2003/10/Serialization/Arrayshttp://schemas.datacontract.org/2004/07/System。对于每个系统架构(即包含http://schemas.datacontract.org/2004/07/System 的架构),我们添加一个http://schemas.microsoft.com/2003/10/Serialization 的导入。
  • 啊,所以问题是 1) Flex 不喜欢从外部源导入的模式和 2) 生成的引用 XSD 模式没有正确导入它们引用的所有内容?我想这应该不难解决。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
相关资源
最近更新 更多