我想从ASP.NET Core 2.1中的wsdl url生成C#类。
WSDL网址为:Spring documentation
我使用“Microsoft WCF Web服务引用提供程序”工具生成C#类并出现以下错误:
错误:未生成任何代码。 如果您尝试生成客户端,可能是因为元数据文档不包含任何有效的合同或服务 或者因为发现所有合同/服务都存在于/ reference程序集中。验证是否已将所有元数据文档传递给该工具。 完成。
任何解决方案都会受到欢迎。
答案 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
遗憾的是,没有通用解决方案。以下是一些选项:
wsdl.exe
和ASMX是不可能的。如果必须使用它们,则必须切换到Full框架。 警告强>
拨打电话并不意味着您可以与提供商进行通信。 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
这生成了没有任何问题的类。我测试了这个解决方案。