从 wsdl 生成 c# 类

Generate c# classes from wsdl

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

WSDL url 是:https://airarabia.isaaviations.com/webservices/services/AAResWebServices?wsdl

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

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.

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

将您的 WSDL 文件下载到本地。然后,运行以下命令:

wsdl.exe /verbose /namespace:Air /out:D:\t\ar /protocol:SOAP /language:CS C:\path\to\wsdl\AAResWebServices_1.wsdl

将命名空间更改为您选择的命名空间。

WSDL.exe 是您的 Windows SDK 的一部分:

C:\Program Files (x86)\Microsoft SDKs\Windows

我的在 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin

这生成了 类,没有任何问题。我测试了这个解决方案。

简答

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

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

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

从 NuGet 添加 System.ServiceModel.Primitives 到项目的依赖项。由于 ASP.NET 核心不使用 web.config 文件,您可能必须在创建代理 class 时自己创建绑定,例如:

var binding = new BasicHttpsBinding(BasicHttpsSecurityMode.Transport);
var address = new EndpointAddress("http://airarabia.isaaviations.com/webservices/services/AAResWebServices");
var client = new AAResWebServicesClient((Binding)binding, address);

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

说明

航空公司和 GDS 不擅长遵循网络互操作性标准。它们足够大,如果有任何变化,必须由旅行社来处理。一旦他们指定了他们的标准,他们也不会在意改变它。

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

您提供的 WSDL 与 Sabre 的相似。它使用 一些 OTA 的操作,如 OTA_PING 并添加自定义操作。幸运的是,它不包含任何 tool-breakers 之类的匿名内部类型。

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

然后,有些甚至不尊重他们自己的 XSD,例如 Farelogix。他们可能 return out-of-range 枚举值并说 "well, the XSD is for information purposes only"。 wsdl 文件明确标记为 not for production use

不幸的是,没有通用的解决方案。以下是一些选项:

  • wsdl.exe和ASMX如果要用.NET Core是不行的。如果必须使用它们,则必须切换到完整框架。
  • 为每个服务创建 WCF 个人 代理。文件的大小要小得多,并且您可以避免多种服务使用的类型之间的冲突,例如 Airport,这些服务有细微的变化甚至不兼容。
  • 使用 Fiddler 或其他工具来捕获请求和响应。使用这些作为模板来创建纯 HTTP GET 请求。这是一个肮脏的解决方案,但如果您不信任提供者的 WSDL 和 XSD
  • 可以 证明它更快、更可靠

警告

拨打电话并不意味着您可以与提供商沟通。 ebXML over SOAP 的主要问题之一是 body 没问题,但 headers,包括那些用于身份验证的都是错误的。这意味着必须创建身份验证元素

另一个问题是身份验证字段经常被滥用,例如使用身份验证 headers 我们会考虑 session 令牌。 GDS 仍然使用大型机,那些 session 令牌通常映射到实际终端 sessions。

这意味着必须手动创建身份验证 headers,而不是依赖 WCF 来生成它们。这也意味着交易是有状态的——必须跟踪session用于该预订才能预订,确保所有以前的交易都已完成,然后再开始新的交易等。