【问题标题】:Circular reference error while trying to import WSDL into Visual Studio 2013尝试将 WSDL 导入 Visual Studio 2013 时出现循环引用错误
【发布时间】:2015-12-07 06:24:33
【问题描述】:

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

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

当使用a modified version of the WSDL, created by the Israeli Ministry of Transporation 时,会删掉很多方法,我得到另一个错误(以及其他错误):

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

似乎某些元素定义出现在不止一个 XSD 中。所以我尝试使用svcutil.exe 手动创建代理代码。我逐个文件添加了依赖项所需的文件。起初,我可以选择添加哪个文件,siri.xsdsiri\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 和 Visual Studio 方面有更多经验的人提供帮助,或者只是一般的 SOAP 服务(或特别是这个服务)来解决这个问题。

请注意,SIRI 在两个单独的文件中呈现 Web 服务接口,siri_wsProducer.wsdlsiri_wsConsumer.wsdl。据我所知,我有兴趣与“生产者”进行交互。

这个问题是相关的 - 它显然是由一位开发人员提出的,如果他参与这次讨论,我将非常感谢他,因为他似乎找到了解决方案: Importing WSDL into a .NET project only creates an empty namespace

【问题讨论】:

  • 我尝试了第一个 SIRI 链接和第二个以色列链接,都不包含 WSDL 文件。您能否更新正确的链接,以便我们检查 WSDL?
  • 谢谢@Abel。实际上这两个站点都包含 WSDL 文件。这是direct link to the original SIRI schemasdirect link to the modified Israeli MOT schemas
  • 德克萨斯州。我相信你,但我的意第绪语(如果是这样的话)不是很好。
  • 我尝试导入模式,收到相同的错误(所以它是可重现的,所以可以肯定),但是在玩了一段时间之后,这些模式的绝对复杂性并没有轻易揭示它们问题。很抱歉,但这可能是一个研究问题,为此,我没有时间......
  • @Abel - 感谢您的投入和努力。知道它是可重现的很有用。希望其他人已经体验并解决了这些问题,因为这是一个所谓的“严重”协议。

标签: web-services visual-studio xsd wsdl siri-xml


【解决方案1】:

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

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

    Microsoft.ServiceModel.targets(113,5): error : Group 'ServiceDeliveryBodyGroup' from targetNamespace='http://www.siri.org.uk/siri' has invalid definition: Circular group reference。

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

经过进一步搜索,似乎微软的xsd.exe,类似于wsdl.exesvcutil添加服务引用使用的代码,已经承认了这个to be a limitation of their XSD-to-object mapping tools .

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

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

【讨论】:

    【解决方案2】:

    原来循环引用是这样的:

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

    因此是循环性。

    我发现这一点的方法是注释掉相关组ServiceDeliveryBodyGroup 的每个组件。它引用了一些elements,它们同时设置了type(引用一些complexType)和substitutionGroup(引用一些abstract元素)属性。删除 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" />
    

    (注意:为简洁起见,原代码中的&lt;xsd:annotation/&gt;标签被省略)

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

    【讨论】:

      猜你喜欢
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      • 2018-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多