How to fix unresolved types when importing Exchange Web Services (EWS) wsdl file?

删除回忆录丶 提交于 2019-12-10 20:41:45

问题


When importing the wsdl file from https://ourmail.server/ews/services.wsdl, I initially got a ton of "The following types, referred to in the WSDL document are not being represented in this file" in the generated services.pas.
I then downloaded the wdsl file to disk, saw that it referenced http://schemas.microsoft.com/exchange/services/2006/messages and http://schemas.microsoft.com/exchange/services/2006/types, downloaded https://ourmail.server/ews/types.xsd and https://ourmail.server/ews/messages.xsd and modified the start of services.wdsl from

<?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>

to:

<?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>

Now the generated services.pas contains (only) these errors:

// ************************************************************************ //
// 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]

What "xs:import" line can I add to resolve these?
I have searched around for the W3C's datatypes.xsd and structures.xsd and tried the same approach, but I can't get it to work.


回答1:


There is a Web Services Toolkit for Delphi and Free Pascal, which also has a WSDL importer.

Maybe this one is able to process the WSDL, I would give it a try.




回答2:


It turns out those "types not being represented" in the file are fine. It seems as if "The types from the latter category typically map to predefined/known XML or Embarcadero types" is exactly the case for most of these types. The 'strange' ones like nonNegativeInteger and Base64Binary are not used anywhere else in the source.

One additional remark: I made an error specifying the initial WDSL. That URL gave a certificate error which prevented the dependent files from being imported. Once I tried an alternate URL without cert errors the https://webmail.ourmailserver.nl/ews/messages.xsd and https://webmail.ourmailserver.nl/ews/types.xsd were imported properly and I no longer had to do that from disk.

The generated file initially does not compile because of the following constructs:

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;

In the setter, what is meant is the boolean value, but the compiler thinks it is the published properly named True, and will issue an 'Incompatible types'. I changed the "FAllInternal_Specified := True;" to "FAllInternal_Specified := System.True;"

In the same manner, there are two published properties Create, and the compiler thinks these are constructors overriding those in the base calls. I changed their names to MyCreate.

This makes the generated file compile.



来源:https://stackoverflow.com/questions/13084064/how-to-fix-unresolved-types-when-importing-exchange-web-services-ews-wsdl-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!