从wsdl生成c#类

时间:2018-03-19 08:35:25

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

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

WSDL网址为:Spring documentation

我使用“Microsoft WCF Web服务引用提供程序”工具生成C#类并出现以下错误:

  

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

任何解决方案都会受到欢迎。

2 个答案:

答案 0 :(得分:6)

简短回答

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

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

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

将NuGet中的System.ServiceModel.Primitives添加到项目的依赖项中。由于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的另一种提议,它没有成为标准。然后,他们使用ebXML over SOAP,使用的机制并没有成为后来的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是不可能的。如果必须使用它们,则必须切换到Full框架。
  • 为每项服务创建WCF 个人代理。文件的大小要小得多,您可以避免多种服务使用的机场之间的冲突,这些类型会有轻微变化甚至不兼容。
  • 使用Fiddler或其他工具捕获请求和响应。使用这些作为模板来创建纯HTTP GET请求。这是一个肮脏的解决方案,但如果你不能信任提供者的WSDL和XSD,那么可以证明更快,更可靠

警告

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

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

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

答案 1 :(得分:3)

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

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