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

Web services 尝试将WSDL导入Visual Studio 2013时出现循环引用错误,web-services,visual-studio,xsd,wsdl,siri-xml,Web Services,Visual Studio,Xsd,Wsdl,Siri Xml,导入在Microsoft Visual Studio 2013中描述的WSDL文件时,我遇到一个错误: 警告5 自定义工具警告:无法导入操作GetProductionTimeline中名为FaultName的错误。不支持WSDL,错误消息部分必须引用元素。此故障消息不引用元素。如果您具有对WSDL文档的编辑访问权,则可以通过使用“element”属性引用架构元素来解决此问题。C:\path\to\TransportationDemo\TransportationDemo\Service Refe

导入在Microsoft Visual Studio 2013中描述的WSDL文件时,我遇到一个错误:

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

当使用时,它删除了许多方法,我得到了另一个错误(在其他错误中):

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

有些元素定义似乎出现在多个XSD中。因此,我尝试使用
svcuti.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\u stopTimeline\u service.xsd
(对于
MonitoringRefStructure
的定义),然后上面的循环依赖项错误消息再次出现

我在这里不知所措,如果有人在VisualStudio的WSDL方面有更多的经验,或者仅仅是SOAP服务(或者特别是这一个),我将非常感谢他们的帮助,以解决这个问题

请注意,SIRI在两个单独的文件中提供web服务接口,
SIRI\u wsProducer.wsdl
SIRI\u wsConsumer.wsdl
。据我所知,我对与“制作人”互动很感兴趣

这个问题是相关的——显然是由一位开发人员同事提出的,如果他能参与讨论,我将非常感激,因为他似乎找到了一个解决方案:

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

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

    Microsoft.ServiceModel.targets(113,5):错误:targetNamespace=''中的组“ServiceDeliveryBodyGroup”具有无效的定义:循环组引用

    这是一个棘手的问题,因为我没有设法追踪为什么它被认为是循环的,但如果它是。它被进口了两次,但这似乎不是原因,我认为这是故意的

在进一步搜索之后,Microsoft的
xsd.exe
(与
wsdl.exe
svcutil
和添加服务引用所使用的代码类似)似乎已经确认了这一点

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


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

结果是循环引用如下所示:

  • ServiceDeliveryStructure complexType
    基于
  • 产品响应结构
    ,基于
  • <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" />