【问题标题】:.Net Core 3.1 importing WSDL Errors - How to work around?.Net Core 3.1 导入 WSDL 错误 - 如何解决?
【发布时间】:2020-10-20 13:24:20
【问题描述】:

我正在尝试将一些服务器代码从 .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 时出错。 XPath 到 wsdl:binding: 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= '个人服务HttpPost'] 无法导入 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 时出错。 XPath 到 wsdl:binding: //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 专家),如果可能的话,我需要做些什么来解决这些错误?

【问题讨论】:

  • @Gusman 感谢您的建议,但我的代码没有似乎是他们的解决方案的 XHttpBinding。
  • 不,但你的问题是一样的,.net core 不支持的各种绑定,例如:/wsdl:binding[@name='IndividualServiceHttpGet']
  • 所以这些应该在尝试导入之前从 WSDL 中删除?我是 WSDL 的新手,所以不确定该怎么做。

标签: c# .net .net-core soap wsdl


【解决方案1】:

将 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>

【讨论】:

  • 我将此标记为正确答案。我最终通过编辑下载的 WSDL 文件自己解决了这个问题,现在它正在工作。让我呆了一段时间的是 VS 并没有在编辑后刷新文件,我不得不在每次测试编辑后继续重命名为新文件。我自己回来添加这个答案,让其他人知道该怎么做(因为很多人似乎都在挣扎),但是看到你已经回答了,我只会将你的标记为正确。谢谢!
【解决方案2】:

之后我遇到了类似的问题,我使用“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/?

【讨论】:

    猜你喜欢
    • 2021-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2019-01-23
    • 2020-05-23
    • 2020-11-01
    相关资源
    最近更新 更多