【问题标题】:Generate c# classes from wsdl [closed]从 wsdl 生成 c# 类 [关闭]
【发布时间】:2018-03-19 08:35:25
【问题描述】:

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

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

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

错误:没有生成代码。 如果您尝试生成客户端,这可能是因为元数据文档不包含任何有效的合同或服务 或者因为发现所有合同/服务都存在于 /reference 程序集中。验证您是否将所有元数据文档传递给该工具。 完成。

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

【问题讨论】:

  • "这可能是因为元数据文档不包含任何有效的合同或服务,或者因为发现所有合同/服务都存在于 /reference 程序集中。验证您是否通过了所有元数据文档到工具。 " 你验证了吗?
  • 将 WSDL 和所有相关的 XSD 文件下载到本地,然后使用本地版本重试。它应该可以工作。
  • 反对者,除非您过去曾与 GDS 和航空公司合作过,否则请立即停止。航空公司太重要了,不必费心遵守既定标准等细节
  • @Ahmad1334 航空公司在网络标准方面松散而快速。很可能是 WSDL 无效。尝试 svcutil.exe` 来生成类。如果您能并且没有收到任何错误,您就会知道这可能是 .NET Core 的 WCF 支持存在的问题。好消息是您可以在 .NET Core 项目中重用生成的类
  • @Ahmad1334 如果svcutil.exe 抱怨,这可能意味着航空公司不支持 SOAP 或 WS-* 标准。例如,Sabre 没有,而是通过 SOAP 提供 ebXML。其他服务,例如 Farelogix 甚至不尊重他们自己的 XSD

标签: c# wcf asp.net-core wsdl


【解决方案1】:

简答

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

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

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

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

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 并添加自定义操作。幸运的是,它不包含任何工具破坏器,如匿名内部类型。

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

然后,有些甚至不尊重他们自己的 XSD,例如 Farelogix。他们可能会返回超出范围的枚举值并说“好吧,XSD 仅供参考”。 wsdl 文件明确标记为not for production use

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

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

警告

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

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

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

【讨论】:

  • 谢谢一百万,它有效。
  • 很详细很好的解释。
  • 那是我的痛苦之谈。我现在正在与 Farelogix 合作,刚刚发现他们更改了不同日期的退款信息!即使今天打电话
【解决方案2】:

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

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

【讨论】:

  • wsdl.exe 用于 ASMX 服务。这些类不是 .NET Core 的一部分。
  • @PanagiotisKanavos 我真的没有检查过这里的“核心”是/不可用的——但大概svcutil.exe 更可取?
  • @MarcGravell 是的,但痛苦在别处。航空公司太大了,不会为遵循标准这样的细节而烦恼。在我的回答中解释了
  • @MarcGravell 这个 Q 是一个很好的例子,这些问题可能看起来很糟糕,但如果你了解业务,则不是
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多