在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.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
的定义),然后再次出现上面的循环依赖性错误消息。 / p>
我在这里不知所措,并且非常感谢那些在使用Visual Studio的WSDL方面有经验的人,或者只是一般的SOAP服务(或者特别是这个),以解决这个问题。
请注意,SIRI在两个单独的文件siri_wsProducer.wsdl
和siri_wsConsumer.wsdl
中提供Web服务界面。据我所知,我有兴趣与“制片人”接触。
这个问题是相关的 - 显然是由一位开发人员,如果他参与这个讨论,我会非常感激,因为他似乎找到了一个解决方案: Importing WSDL into a .NET project only creates an empty namespace
答案 0 :(得分: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
元素)属性集。删除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/>
标记是为了简洁而省略的)
我会测试它,如果它按预期工作,我会接受我自己的答案......