从 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用于该预订才能预订,确保所有以前的交易都已完成,然后再开始新的交易等。
我想从 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用于该预订才能预订,确保所有以前的交易都已完成,然后再开始新的交易等。