导入 Exchange Web 服务 (EWS) wsdl 文件时如何修复未解析的类型?
Posted
技术标签:
【中文标题】导入 Exchange Web 服务 (EWS) wsdl 文件时如何修复未解析的类型?【英文标题】:How to fix unresolved types when importing Exchange Web Services (EWS) wsdl file? 【发布时间】:2012-10-26 09:15:40 【问题描述】:从https://ourmail.server/ews/services.wsdl 导入 wsdl 文件时,我最初在生成的 services.pas 中得到大量“WSDL 文档中引用的以下类型在此文件中未表示”。 然后我将 wdsl 文件下载到磁盘,看到它引用了 http://schemas.microsoft.com/exchange/services/2006/messages 和 http://schemas.microsoft.com/exchange/services/2006/types,下载了 https://ourmail.server/ews/types.xsd 和 https://ourmail.server/ews/messages.xsd 并修改了 services.wdsl 的开头
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:s="http://www.w3.org/2001/XMLSchema" targetNamespace="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://schemas.microsoft.com/exchange/services/2006/messages" schemaLocation="messages.xsd"/>
</xs:schema>
</wsdl:types>
到:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:s="http://www.w3.org/2001/XMLSchema" targetNamespace="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://schemas.microsoft.com/exchange/services/2006/messages" schemaLocation="file://d:/testing/web/exchange web services/types.xsd"/>
<xs:import namespace="http://schemas.microsoft.com/exchange/services/2006/messages" schemaLocation="file://d:/testing/web/exchange web services/messages.xsd"/>
</xs:schema>
</wsdl:types>
现在生成的 services.pas 包含(仅)这些错误:
// ************************************************************************ //
// The following types, referred to in the WSDL document are not being represented
// in this file. They are either aliases[@] of other types represented or were referred
// to but never[!] declared in the document. The types from the latter category
// typically map to predefined/known XML or Embarcadero types; however, they could also
// indicate incorrect WSDL documents that failed to declare or import a schema type.
// ************************************************************************ //
// !:double - "http://www.w3.org/2001/XMLSchema"[Gbl]
// !:duration - "http://www.w3.org/2001/XMLSchema"[Gbl]
// !:time - "http://www.w3.org/2001/XMLSchema"[Gbl]
// !:base64Binary - "http://www.w3.org/2001/XMLSchema"[Gbl]
// !:boolean - "http://www.w3.org/2001/XMLSchema"[Gbl]
// !:int - "http://www.w3.org/2001/XMLSchema"[Gbl]
// !:string - "http://www.w3.org/2001/XMLSchema"[Gbl]
// !:language - "http://www.w3.org/2001/XMLSchema"[Hdr][Gbl]
// !:dateTime - "http://www.w3.org/2001/XMLSchema"[Gbl]
// !:lang - "http://www.w3.org/2001/XMLSchema"[GblAttr]
// !:nonNegativeInteger - "http://www.w3.org/2001/XMLSchema"[Gbl]
// !:anyURI - "http://www.w3.org/2001/XMLSchema"[Gbl]
// !:short - "http://www.w3.org/2001/XMLSchema"[Gbl]
我可以添加什么“xs:import”行来解决这些问题? 我搜索了 W3C 的 datatypes.xsd 和 structure.xsd 并尝试了相同的方法,但我无法让它工作。
【问题讨论】:
这是 SOAP 1.1 还是 SOAP 1.2 WSDL? 我已经告诉 Delphi 的 WDSL 导入器使用“自动 SOAP 版本控制”。选择其他两个选项“仅处理 SOAP 1.1/1.2 协议的 WSDL 绑定扩展”没有区别 好的。我只是不确定在 WSDL 的哪个位置可以看到它是 1.1 还是 1.2 这似乎是模棱两可的***.com/questions/736845/…,也许community.jboss.org/thread/196924?_sscc=t 生成的代码中还有其他错误。我设法摆脱了这些(请参阅我在forums.embarcadero.com/thread.jspa?messageID=504322#504322 的回答),现在看起来好像上面提到的缺失定义不相关。我会继续测试,如果我发现更多,我会添加一个正确的答案。 【参考方案1】:有一个Web Services Toolkit for Delphi and Free Pascal,它也有一个WSDL 导入器。
也许这个可以处理WSDL,我试试看。
【讨论】:
【参考方案2】:事实证明,文件中的那些“未表示的类型”很好。 似乎“后一类的类型通常映射到预定义/已知的 XML 或 Embarcadero 类型”对于大多数这些类型来说正是这种情况。像 nonNegativeInteger 和 Base64Binary 这样的“奇怪”在源代码的其他任何地方都没有使用。
补充一点:我在指定初始 WDSL 时出错。该 URL 给出了一个证书错误,导致无法导入依赖文件。一旦我尝试了没有证书错误的备用 URL,https://webmail.ourmailserver.nl/ews/messages.xsd 和 https://webmail.ourmailserver.nl/ews/types.xsd 就被正确导入,我不再需要从磁盘执行此操作。
由于以下结构,生成的文件最初无法编译:
type
ProtectionRuleAllInternalType = string;
ProtectionRuleTrueType = string;
ProtectionRuleConditionType = class(TRemotable)
private
FAllInternal: ProtectionRuleAllInternalType;
FAllInternal_Specified: boolean;
procedure SetAllInternal(Index: Integer; const AProtectionRuleAllInternalType: ProtectionRuleAllInternalType);
public
published
property True: ProtectionRuleTrueType;
end;
procedure ProtectionRuleConditionType.SetAllInternal(Index: Integer; const AProtectionRuleAllInternalType: ProtectionRuleAllInternalType);
begin
FAllInternal := AProtectionRuleAllInternalType;
FAllInternal_Specified := True;
end;
在 setter 中,它的意思是布尔值,但编译器认为它是已发布的正确命名的 True,并将发出“不兼容类型”。 我更改了“FAllInternal_Specified := True;”到“FAllInternal_Specified := System.True;”
以同样的方式,有两个已发布的属性 Create,编译器认为这些是覆盖基调用中的构造函数。我把他们的名字改成了 MyCreate。
这会使生成的文件编译。
【讨论】:
以上是关于导入 Exchange Web 服务 (EWS) wsdl 文件时如何修复未解析的类型?的主要内容,如果未能解决你的问题,请参考以下文章
使用 TokenCredentials 的 Exchange Web 服务 (EWS) 单点登录?