.Net Core 3.1导入WSDL错误-如何解决?

问题描述

我正在尝试将一些服务器代码从.Net 4.7迁移到.Net Core 3.1,以便我们可以在Linux主机上运行。

有两种使用SOAP的连接服务。一个移植了零更改,但另一个移植了使用WSDL文件导入时的错误

http://uat.risc.enexusrental.co.uk/SOAP/IndividualService.php?wsdl

我不是SOAP专家,并且只使用过导入WSDL文件生成代码,因此这些错误对我来说意义不大。

无法导入wsdl:port 详细信息:导入wsdl:port所依赖的wsdl:binding时出错。 wsdl:binding的XPath:wsdl:deFinitions [@ targetNamespace ='http://uat.risc.enexusrental.co.uk'] / wsdl:binding [@ name ='IndividualServiceHttpPost'] 错误的XPath来源://wsdl:deFinitions[@targetNamespace='http://uat.risc.enexusrental.co.uk']/wsdl:service[@name='IndividualService']/wsdl:port[@name= 'IndividualServiceHttpPost'] 无法导入wsdl:binding 详细信息:来自名称空间“ http://schemas.xmlsoap.org/wsdl/http/”的必需WSDL扩展元素“绑定”未处理。 错误的XPath来源://wsdl:deFinitions[@targetNamespace='http://uat.risc.enexusrental.co.uk']/wsdl:binding[@name='IndividualServiceHttpPost'] 无法导入wsdl:port 详细信息:导入wsdl:port所依赖的wsdl:binding时出错。 wsdl:binding的XPath://wsdl:deFinitions[@targetNamespace='http://uat.risc.enexusrental.co.uk']/wsdl:binding[@name='IndividualServiceHttpGet'] 错误的XPath来源://wsdl:deFinitions[@targetNamespace='http://uat.risc.enexusrental.co.uk']/wsdl:service[@name='IndividualService']/wsdl:port[@name= 'IndividualServiceHttpGet'] 无法导入wsdl:binding 详细信息:来自名称空间“ http://schemas.xmlsoap.org/wsdl/http/”的必需WSDL扩展元素“绑定”未处理。 错误的XPath来源:// wsdl:deFinitions [@ targetNamespace ='http://uat.risc.enexusrental.co.uk'] / wsdl:binding [@ name ='IndividualServiceHttpGet']

为简化调试,我创建了简单的命令行应用程序,一个用于.Net 4.7,另一个用于Core 3.1。

.Net 4.7的导入效果非常好,我可以按预期方式调用该服务。

导入Core 3.1会出现上述错误,并且在调用客户端初始化时会返回以下错误

Client.Channel ='Client.Channel'引发了'System.ServiceModel.CommunicationObjectFaultedException'类型的异常

手动导入svcutil.exe时遇到相同的错误

谷歌搜索3天后,我不再赘述,因为每个问题似乎都不相同,并且所有解决方案均无效。

有人会友好地解释这些错误的实际含义(我不是SOAP专家),如果可能的话,我需要做些什么来解决这些错误

解决方法

将WSDL下载到文件中,并通过删除相应的wsdl:bindingwsdl:port元素来手动删除不受支持的GET和POST绑定。然后,您可以使用工具(dotnet-svcutil或Visual Studio / IDE)来生成客户端代码(服务参考)。

    --- a/service.wsdl
    +++ b/service.wsdl
    @@ -286,37 +286,6 @@
           </wsdl:output>
         </wsdl:operation>
       </wsdl:binding>
    -  <wsdl:binding name="IndividualServiceHttpGet" type="tns:IndividualServiceHttpGet">
    -    <http:binding verb="GET" />
    -    <wsdl:operation name="SearchByLastNameAndDateOfBirth">
    -      <http:operation location="/SearchByLastNameAndDateOfBirth" />
    -      <wsdl:input>
    -        <http:urlEncoded />
    -      </wsdl:input>
    -      <wsdl:output>
    -        <mime:mimeXml part="Body" />
    -      </wsdl:output>
    -    </wsdl:operation>
    -    <wsdl:operation name="SearchByDrivingLicenceNumber">
    -      <http:operation location="/SearchByDrivingLicenceNumber" />
    -      <wsdl:input>
    -        <http:urlEncoded />
    -      </wsdl:input>
    -      <wsdl:output>
    -        <mime:mimeXml part="Body" />
    -      </wsdl:output>
    -    </wsdl:operation>
    -    <wsdl:operation name="Get">
    -      <http:operation location="/Get" />
    -      <wsdl:input>
    -        <http:urlEncoded />
    -      </wsdl:input>
    -      <wsdl:output>
    -        <mime:mimeXml part="Body" />
    -      </wsdl:output>
    -    </wsdl:operation>
    -  </wsdl:binding>
    -  <wsdl:binding name="IndividualServiceHttpPost" type="tns:IndividualServiceHttpPost">
         <http:binding verb="POST" />
         <wsdl:operation name="SearchByLastNameAndDateOfBirth">
           <http:operation location="/SearchByLastNameAndDateOfBirth" />
    @@ -354,11 +323,5 @@
         <wsdl:port name="IndividualServiceSoap12" binding="tns:IndividualServiceSoap12">
           <soap12:address location="http://uat.risc.enexusrental.co.uk/SOAP/IndividualService.php" />
         </wsdl:port>
    -    <wsdl:port name="IndividualServiceHttpGet" binding="tns:IndividualServiceHttpGet">
    -      <http:address location="http://uat.risc.enexusrental.co.uk/SOAP/IndividualService.php" />
    -    </wsdl:port>
    -    <wsdl:port name="IndividualServiceHttpPost" binding="tns:IndividualServiceHttpPost">
    -      <http:address location="http://uat.risc.enexusrental.co.uk/SOAP/IndividualService.php" />
    -    </wsdl:port>
       </wsdl:service>
     </wsdl:definitions>
,

之后我遇到了类似的问题,我使用“svcutil”并使用以下命令创建了一个批处理文件

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64\svcutil.exe" <your service address/url like http://localhost:*****/***/**/***** >  /o:"<name of class file to be created>.cs" /r:"..\..\<Any reference assembly if any otherwise leave this>" /n:*,<targetNamespace>  /ct:<collectionType:<type> like System.Collections.Generic.List`1>

有关 svcutil 的更多信息,请转到 VS 的 dev 命令并运行命令:svcutil/?