gpt4 book ai didi

c# - 从 wsdl 生成 c# 类

转载 作者:太空狗 更新时间:2023-10-29 22:29:44 32 4
gpt4 key购买 nike

关闭。这个问题需要debugging details .它目前不接受答案。












想改进这个问题?将问题更新为 on-topic对于堆栈溢出。

3年前关闭。




Improve this question




我想从 ASP.NET Core 2.1 中的 wsdl url 生成 C# 类。

WSDL 网址为:https://airarabia.isaaviations.com/webservices/services/AAResWebServices?wsdl

我使用“Microsoft WCF Web Service Reference Provider”工具生成 C# 类并得到以下错误:

Error: No code was generated. If you were trying to generate a client, this could be because the metadata documents did not contain any valid contracts or services or because all contracts/services were discovered to exist in /reference assemblies. Verify that you passed all the metadata documents to the tool. Done.



任何解决方案将不胜感激。

最佳答案

简答

打开开发命令提示符并运行以生成代理类:

svcutil http://airarabia.isaaviations.com/webservices/services/AAResWebServices?wsdl

请注意,我使用了 http而不是 https .服务器的证书导致 svcutil 出现问题.将类复制到您的项目文件夹中。

添加 System.ServiceModel.Primitives从 NuGet 到项目的依赖项。由于 ASP.NET Core 不使用 web.config文件,您可能必须在创建代理类时自己创建绑定(bind),例如:
var binding = new BasicHttpsBinding(BasicHttpsSecurityMode.Transport);
var address = new EndpointAddress("http://airarabia.isaaviations.com/webservices/services/AAResWebServices");
var client = new AAResWebServicesClient((Binding)binding, address);

在绑定(bind)中, BasicHttpsBinding使用,因为没有航空公司会接受未加密的连接。 Sabre 需要 TLS 1.2 或更高版本。

解释

航空公司和 GDS 并不擅长遵循 Web 互操作性标准。它们足够大,如果有任何变化,必须由旅行社来容纳它们。一旦他们指定了他们的标准,他们也不想改变它。

例如,OTA 标准和 Sabre 的实现是在 2003 年使用 ebXML 创建的,ebXML 是 SOAP 的替代提案,但并未成为标准。然后他们在 SOAP 上使用 ebXML,使用的机制并未成为后来的 SOAP 标准的一部分。当创建 WS-* 标准来修复困惑并确保互操作性时,它们甚至都没有打扰。

您提供的 WSDL 类似于 Sabre 的。它使用了一些 OTA 的操作,如 OTA_PING 并添加了自定义操作。幸运的是,它不包含任何工具破坏器,如匿名内部类型。

您可以使用 wsdl.exe 创建一个 ASMX 代理,使用 2008 年之前的 .NET 堆栈。据我所知,这还没有移植到 .NET Core。也许它是 Windows 兼容包的一部分。毕竟,它是不合规的,并且在 10 年前就被弃用了。 ASMX 多年来也没有任何重大升级。过去,在使用 ASXM 服务(例如 Amadeus)时,我遇到过反序列化器的并发问题。

然后,有些甚至不尊重他们自己的 XSD,例如 Farelogix。他们可能会返回超出范围的枚举值并说“好吧,XSD 仅供引用”。 wsdl文件明确标记 not for production use
不幸的是,没有通用的解决方案。以下是一些选项:
  • wsdl.exe如果你想使用 .NET Core,ASMX 是不可能的。如果必须使用它们,则必须切换到完整框架。
  • 为每个服务创建 WCF 单独代理。文件的大小要小得多,您可以避免多个服务使用的类型(如 Airport)之间的冲突,这些服务略有不同,甚至不兼容。
  • 使用 Fiddler 或其他工具来捕获请求和响应。使用这些作为模板来创建普通的 HTTP GET 请求。这是一个肮脏的解决方案,但如果您不能信任提供者的 WSDL 和 XSD
  • ,它可能会更快更可靠。

    警告

    调用电话并不意味着您可以与提供商沟通。 ebXML over SOAP 的主要问题之一是正文是好的,但 header (包括用于身份验证的 header )都是错误的。这意味着必须创建身份验证元素

    另一个问题是身份验证字段经常被滥用,例如使用身份验证 header 我们会考虑 session token 。 GDS 仍然使用大型机,并且这些 session token 通常映射到实际的终端 session 。

    这意味着必须手动创建身份验证 header ,而不是依赖 WCF 来生成它们。这也意味着事务是有状态的——必须跟踪哪个 session 用于该预订以便进行预订,确保所有先前的事务在开始新事务之前都已完成等。

    关于c# - 从 wsdl 生成 c# 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49358678/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com