3
votes

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.

2
Is this a SOAP 1.1 or SOAP 1.2 WSDL?mjn
I have told Delphi's WDSL importer to use 'Automatic SOAP versioning'. Choosing the other two options "Process only WSDL Bindings extensions for the SOAP 1.1/1.2 Protocol" makes no differenceJan Doggen
ok. I am just not sure where in a WSDL it can be seen if it is 1.1 or 1.2mjn
There were other errors in the generated code. I managed to get rid of these (see my answer at forums.embarcadero.com/thread.jspa?messageID=504322#504322) and it now looks as if the missing definitions mentioned above are not relevant. I continue testing and will add a proper answer if I find out more.Jan Doggen

2 Answers

1
votes

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.

0
votes

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.