3

在 Microsoft Visual Studio 2013 中导入描述SIRI Web 服务的 WSDL 文件时,出现错误:

警告 5
自定义工具警告:无法导入操作 GetProductionTimetable 中名为 FaultName 的故障。不支持的 WSDL,故障消息部分必须引用一个元素。此故障消息未引用元素。如果您对 WSDL 文档具有编辑权限,则可以通过使用“元素”属性引用架构元素来解决问题。C:\path\to\TransportationDemo\TransportationDemo\Service References\ServiceReference\Reference.svcmap 1

当使用由以色列交通部创建的 WSDL 的修改版本时,它删去了很多方法,我得到另一个错误(以及其他错误):

警告 5
自定义工具警告:无法导入 wsdl:portType
详细信息:运行 WSDL 导入扩展时引发异常:System.ServiceModel.Description.XmlSerializerMessageContractImporter
错误:来自 targetNamespace=' http://www.siri.org的组'ServiceDeliveryBodyGroup' .uk/siri '的定义无效:循环组引用。
错误源的 XPath: //wsdl:definitions[@targetNamespace=' http://new.webservice.namespace ']/wsdl:portType[@name='SOAP-Port'] C:\path\to\TransportationDemo\TransportationDemo \Service References\ServiceReference1\Reference.svcmap 1

似乎某些元素定义出现在不止一个 XSD 中。所以我尝试使用svcutil.exe手动创建代理代码。我逐个文件添加了依赖项所需的文件。起初,我可以选择添加哪个文件,siri.xsd或者siri\siri_base-v1.3.xsd,因为它们都包含ServiceRequestStructure元素的定义。

siri.xsd路径中,我添加了所有依赖项并最终得到上述相同的循环引用。

siri\siri_base-v1.3.xsd我实际上可以生成代码。我可以创建一个SOAPPortClient对象实例。我想调用GetStopMonitoringServiceRequest它的方法。但是为了让我能够输入必填字段,我需要一个StopMonitoringRequestStructure对象的实例。这是在siri_stopMonitoring_service.xsd文件中定义的,并且未包含在用于生成此代理的 XSD 列表中。当我添加此架构文件时,我也必须添加siri_stopTimetable_service.xsd(对于 的定义MonitoringRefStructure),然后再次出现上面的循环依赖错误消息。

我在这里不知所措,希望在 WSDL 方面有更多经验的人帮助我解决这个问题。

请注意,SIRI 在两个单独的文件中提供 Web 服务接口, siri_wsProducer.wsdl并且siri_wsConsumer.wsdl. 据我所知,我对与“制片人”的交互很感兴趣。

这个问题是相关的——显然是由一位开发人员提出的,如果他参与这个讨论,我将非常感谢,因为他似乎找到了解决方案: 将 WSDL 导入 .NET 项目只会创建一个空的命名空间

4

2 回答 2

2

我对您的模式和 WSDL 进行了更多尝试,并找到了您问题的答案,尽管您可能不喜欢它......

  • 取消选中 re-use types 复选框没有区别,因为这只适用于重新导入定义的情况
  • 导入后,Visual Studio 将所有 XSD 放在服务引用下(单击“显示隐藏文件”)。选择siri.xsd它会告诉你它找不到两个包含。
  • 为了解决包含问题,我将包含 URI 更改为绝对 URI。这解决了 Visual Studio 无法找到文件然后正确复制它们的问题。
  • 现在重建时,它将在“调试输出”窗口中显示正确的验证错误。最重要的是,它抱怨重新定义。我设法通过删除任何引用xml.xsd并简化使用它的几个地方(xml:lang仅)来解决这个问题。接下来我将所有 XSD 直接放在根目录下并修复所有引用xsl:importxsl:include反映这一点。许多重新定义错误现在消失了
  • 它现在抱怨一个xs:group循环(它以前这样做过,但我希望其他警告不碍事):

    Microsoft.ServiceModel.targets(113,5):错误:来自 targetNamespace=' http ://www.siri.org.uk/siri ' 的组“ServiceDeliveryBodyGroup”定义无效:循环组引用。

    这是一个棘手的问题,因为我没有设法追踪为什么它被认为是循环的,但如果是,这在 XSD 中是允许的。它被导入两次,但这似乎不是原因,我认为这是故意的。

经过一些进一步的搜索,微软似乎已经承认这是他们的 XSD 到对象映射工具的限制xsd.exe,它与 使用的代码相似wsdl.exesvcutil添加了服务引用

我认为你最好的选择是把那个组变成非循环的。之后,它应该接受有效的模式并继续。进口商抱怨的事实wsdl:portType并没有为您指明正确的方向。它抱怨这一点,因为它无法映射所有类型,这导致根本没有映射任何类型,之后也是wsdl:portType未知的,因此出现错误。

ServiceDeliveryBodyGroup在您修复类型后,上述其他步骤很可能已过时。其他错误实际上是警告,我相信微软基本上忽略了这样的重新定义,并将“正常”进行。

于 2015-09-13T15:47:11.613 回答
0

事实证明,循环引用是这样的:

  • ServiceDeliveryStructure complexType是基于
  • ProducerResponseStructure,这是基于
  • abstract ResponseStructure conplexType包含
  • SiriServiceDeliveryGroup group, 其中包含
  • StopMonitoringDelivery element, 可以代替
  • ,abstract AbstractFunctionalServiceDelivery element可以代替
  • 哪个abstract AbstractResponse element
  • 再次,abstract ResponseStructure complexType

因此是循环性。

我发现这一点的方法是注释掉相关组的每个组件,ServiceDeliveryBodyGroup. 它引用了一些element同时设置了type(引用一些complexType)和substitutionGroup(引用一些abstract元素)属性的 s。删除type并没有删除循环abstract性,并且由于类型很简单,因此它挑出了abstract ResponseStructure complexType. 回到ServiceDeliveryBodyGroup,看看它是从哪里来的(在浏览了它的内容的每个部分之后,它是制作任何圆形的唯一选择),很快就发现了问题。

另一方面,在我看来,一个元素可以被一个元素替换为abstract="true". 但我对 XSD 了解不多。所以这可能是有道理的。

我没有试图弄清楚这一点,而是决定让ServiceDeliveryStructure,而不是基于ProducerResponseStructure,来包含后者包含的组。我想这相当于使用混合继承而不是真正的继承。AFAIK 它应该保留相同的 XML 结构,确实——稍微模糊了依赖关系树——但允许根据需要完全导入 Visual Studio。

更详细地说,我替换以下

<xsd:complexContent>
    <xsd:extension base="ProducerResponseStructure">
        <xsd:sequence>
            <xsd:group ref="ServiceDeliveryBodyGroup"/>
        </xsd:sequence>
        <xsd:attribute name="srsName" type="SrsNameType" />
    </xsd:extension>
</xsd:complexContent>

与以下

<xsd:sequence>
    <xsd:group ref="ProducerResponseEndpointGroup"/>
    <xsd:group ref="ServiceDeliveryBodyGroup"/>
</xsd:sequence>
<xsd:attribute name="srsName" type="SrsNameType" />

(注意:<xsd:annotation/>为简洁起见,省略了原始代码中的标记)

我会测试它,如果它按预期工作,我会接受我自己的答案......

于 2015-09-15T22:42:47.270 回答