尝试将WSDL导入Visual Studio 2013时出现循环引用错误

时间:2015-09-10 20:10:52

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

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

  

警告5
  自定义工具警告:无法导入操作GetProductionTimetable中名为FaultName的故障。不支持的WSDL,故障消息部分必须引用一个元素。此错误消息不引用元素。如果您具有对WSDL文档的编辑权限,则可以通过使用“element”属性引用schema元素来解决问题。 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 \ Reference.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的定义),然后再次出现上面的循环依赖性错误消息。 / p>

我在这里不知所措,并且非常感谢那些在使用Visual Studio的WSDL方面有经验的人,或者只是一般的SOAP服务(或者特别是这个),以解决这个问题。

请注意,SIRI在两个单独的文件siri_wsProducer.wsdlsiri_wsConsumer.wsdl中提供Web服务界面。据我所知,我有兴趣与“制片人”接触。

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

1 个答案:

答案 0 :(得分:0)

事实证明,循环引用如下:

  • ServiceDeliveryStructure complexType基于
  • ProducerResponseStructure,基于
  • abstract ResponseStructure conplexType 但包含
  • SiriServiceDeliveryGroup group,其中包含
  • StopMonitoringDelivery element,可替代
  • abstract AbstractFunctionalServiceDelivery element,可替代
  • abstract AbstractResponse element
  • 再次, abstract ResponseStructure complexType
因此,循环性。

我发现这一点的方法是通过注释隐含组的每个组件ServiceDeliveryBodyGroup。它引用了一些elementtype(引用一些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" />

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

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

相关问题