Delen via


WSDL- en servicecontracten

Het hulpprogramma Wsutil.exe genereert een C-taalstub op basis van opgegeven WSDL-metagegevens, evenals definities en beschrijvingen van gegevenstypen die worden beschreven door door de gebruiker geschreven XML-schema's.

Hier volgt een voorbeeld van een WSDL-document en EEN XML-schema dat als basis fungeert voor de volgende discussie:

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Example.org" 
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://Example.org" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
 <wsdl:types>
  <xs:schema xmlns:tns="http://Example.org" elementFormDefault="qualified" 
  targetNamespace="http://Example.org" xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:element name="SimpleMethod">
    <xs:complexType>
     <xs:sequence>
      <xs:element name="a" type="xs:int" />
      <xs:element name="b" type="xs:int" />
     </xs:sequence>
    </xs:complexType>
   </xs:element>
   <xs:element name="SimpleMethodResponse">
    <xs:complexType>
     <xs:sequence>
      <xs:element name="b" type="xs:int" />
      <xs:element name="c" type="xs:int" />
     </xs:sequence>
    </xs:complexType>
   </xs:element>
  </xs:schema>
 </wsdl:types>
 <wsdl:message name="ISimpleService_SimpleMethod_InputMessage">
  <wsdl:part name="parameters" element="tns:SimpleMethod" />
 </wsdl:message>
 <wsdl:message name="ISimpleService_SimpleMethod_OutputMessage">
  <wsdl:part name="parameters" element="tns:SimpleMethodResponse" />
 </wsdl:message>
 <wsdl:portType name="ISimpleService">
  <wsdl:operation name="SimpleMethod">
   <wsdl:input wsaw:Action="http://Example.org/ISimpleService/SimpleMethod" 
   message="tns:ISimpleService_SimpleMethod_InputMessage" />
   <wsdl:output wsaw:Action="http://Example.org/ISimpleService/SimpleMethodResponse" 
   message="tns:ISimpleService_SimpleMethod_OutputMessage" />
  </wsdl:operation>
 </wsdl:portType>
 <wsdl:binding name="DefaultBinding_ISimpleService" type="tns:ISimpleService">
  <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
  <wsdl:operation name="SimpleMethod">
   <soap:operation soapAction="http://Example.org/ISimpleService/SimpleMethod" 
   style="document" />
   <wsdl:input>
    <soap:body use="literal" />
   </wsdl:input>
   <wsdl:output>
    <soap:body use="literal" />
   </wsdl:output>
  </wsdl:operation>
 </wsdl:binding>
 <wsdl:service name="SimpleService">
  <wsdl:port name="ISimpleService" binding="tns:DefaultBinding_ISimpleService">
   <soap:address location="http://Example.org/ISimpleService" />
  </wsdl:port>
 </wsdl:service>
</wsdl:definitions>

Dit voorbeeld bevat een contract, ISimpleService, met één methode, SimpleMethod. SimpleMethod heeft twee invoerparameters van het type geheel getal, een en b, die van de client naar de service worden verzonden. Op dezelfde manier heeft SimpleMethod twee uitvoerparameters van het type geheel getal, b en c, die na een geslaagde voltooiing aan de client worden geretourneerd. In de syntaxis van SAL-annotatie C wordt de methodedefinitie als volgt weergegeven:

void SimpleMethod(__in int a, __inout int *  b, __out int * c );

In deze definitie is ISimpleService een servicecontract met één servicebewerking: SimpleMethod.

Het uitvoerheaderbestand bevat definities en beschrijvingen voor externe naslaginformatie. Dit omvat:

  • C-structuurdefinities voor globale elementtypen.
  • Een bewerkingsprototype zoals gedefinieerd in het huidige bestand.
  • Een prototype van een functietabel voor de contracten die zijn opgegeven in het WSDL-bestand.
  • Clientproxy- en service-stub-prototypen voor alle functies die zijn opgegeven in het huidige bestand.
  • Een WS_ELEMENT_DESCRIPTION gegevensstructuur voor de globale schema-elementen die zijn gedefinieerd in het huidige bestand.
  • Een WS_MESSAGE_DESCRIPTION gegevensstructuur voor alle berichten die zijn opgegeven in het huidige bestand.
  • Een WS_CONTRACT_DESCRIPTION gegevensstructuur voor alle contracten die zijn opgegeven in het huidige bestand.

Er wordt één globale structuur gegenereerd om alle globale beschrijvingen voor de schematypen en servicemodeltypen te bevatten waarnaar de toepassing kan verwijzen. De structuur krijgt een naam met een genormaliseerde bestandsnaam. In dit voorbeeld genereert Wsutil.exe een globale definitiestructuur met de naam 'example_wsdl' die alle beschrijvingen van de webservice bevat. De structuurdefinitie wordt gegenereerd in het stub-bestand.

typedef struct _example_wsdl
{
  struct {
    WS_ELEMENT_DESCRIPTION SimpleMethod;
    WS_ELEMENT_DESCRIPTION SimpleMethodResponse;
  } elements;
  struct {
    WS_MESSAGE_DESCRIPTION ISimpleService_SimpleMethod_InputMessage;
    WS_MESSAGE_DESCRIPTION ISimpleService_SimpleMethod_OutputMessage;
  } messages;
  struct {
    WS_CONTRACT_DESCRIPTION DefaultBinding_ISimpleService;
  } contracts;
} _example_wsdl;

extern const _stockquote_wsdl stockquote_wsdl;

Voor globale elementdefinities in het XML-schemadocument (XSD) worden één WS_ELEMENT_DESCRIPTION prototype, evenals de bijbehorende C-typedefinitie, gegenereerd voor elk van de elementen. De prototypen voor de elementbeschrijvingen voor SimpleMethod en SimpleMethodResponse worden gegenereerd als leden in de bovenstaande structuur. De C-structuren worden als volgt gegenereerd:

typedef struct SimpleMethod
{
  int   a;
  int   b;
} SimpleMethod;

typedef struct SimpleMethodResponse
{
  int   b;
  int   c;
} SimpleMethodResponse;

Op dezelfde manier genereert Wsutil.exe type C-structuurdefinities zoals hierboven, zonder overeenkomende elementbeschrijvingen.

Voor WSDL-invoer genereert Wsutil.exe de volgende prototypen en definities:

  • Er wordt een WS_MESSAGE_DESCRIPTION prototype gegenereerd voor de beschrijving van het bericht. Deze beschrijving kan worden gebruikt door het servicemodel en de berichtlaag. Berichtbeschrijvingsstructuren zijn velden met de naam 'messagename' in de globale structuur. In dit voorbeeld wordt de beschrijving van het bericht gegenereerd als het ISimpleService_SimpleMethod_InputMessage veld in de ISimpleService_SimpleMethod_InputMessage structuur zoals opgegeven in het WSDL-bestand.
  • WS_CONTRACT_DESCRIPTION prototype wordt gegenereerd voor de beschrijving van het contract. Deze beschrijving wordt gebruikt door het servicemodel. Contractbeschrijvingsstructuren zijn velden met de naam 'contractnaam' in de globale structuur. In dit voorbeeld wordt de beschrijving van het contract gegenereerd als het DefaultBinding_ISimpleService veld in de structuur '_example_wsdl'.

Bewerkings- en typespecificaties zijn gebruikelijk voor zowel proxy als stub en worden gegenereerd in beide bestanden. Wsutil.exe genereert slechts één kopie als zowel de proxy als de stub in hetzelfde bestand worden gegenereerd.

Id-generatie

De hierboven vermelde automatisch gegenereerde C-structuren worden gemaakt op basis van de naam die is opgegeven in het WSDL-bestand. Een XML NCName wordt doorgaans niet beschouwd als een geldige C-id en de namen worden naar behoefte genormaliseerd. Hex-waarden worden niet geconverteerd en algemene letters zoals ':', '/' en '.' worden geconverteerd naar het onderstrepingsteken '_' om de leesbaarheid te verbeteren.

Koptekst voor de stub

Voor elke bewerking in het servicecontract wordt één callback-routine met de naam '<operationname>Callback' gegenereerd. (De bewerking SimpleMethod in het voorbeeldservicecontract heeft bijvoorbeeld een gegenereerde callback met de naam SimpleMethodCallback.)

typedef HRESULT (CALLBACK *SimpleMethodCallback) (
  const WS_OPERATION_CONTEXT * context,
  int a, int *b, int *c,
  const WS_ASYNC_CONTEXT *asyncContext,
  WS_ERROR * error);

Voor elke WSDL portType Wsutil.exe genereert een functietabel die portTypevertegenwoordigt. Elke bewerking op de portType heeft een bijbehorende functieaanwijzer naar de callback die aanwezig is in de functietabel.

struct ISimpleServiceMethodTable
{
  ISimpleService_SimpleMethodCallback SimpleMethod;
};

Proxyprototypes worden gegenereerd voor alle bewerkingen. De prototypenaam is de naam van de bewerking (in dit geval SimpleMethod) die is opgegeven in het WSDL-bestand voor het servicecontract.

HRESULT WINAPI SimpleMethod(WS_CHANNEL *channel,
  WS_HEAP *heap,
  int a,
  int *b,
  int *c,
  const WS_ASYNC_CONTEXT * asyncContext,
  WS_ERROR * error );

Prototypegeneratie van alleen-lokale beschrijving

De proxy- enstubbestanden bevatten de definitie voor de structuur van de globale definities, inclusief prototypen en definities voor de structuren met alleen-lokale beschrijvingen en clientproxy-/service-stub-implementaties.

Alle prototypen en definities die lokaal zijn voor het stub-bestand, worden gegenereerd als onderdeel van een ingekapselde structuur. Deze overkoepelende lokale beschrijvingsstructuur biedt een duidelijke hiërarchie van de beschrijvingen die vereist zijn voor de serialisatielaag en het servicemodel. De lokale beschrijvingsstructuur heeft prototypen die vergelijkbaar zijn met die hieronder:

struct _filenameLocalDefinitions
{
  struct {
  // schema related output for all the embedded 
  // descriptions that needs to describe global complex types.
  } globalTypes;
  // global elements.
  struct {
  // schema related output, like field description
  // structure description, element description etc.
  ...
  } globalElements;
  struct {
  // messages and related descriptions
  } messages;
  struct {
  // contract and related descriptions.
  } contracts;
  struct {
  // XML dictionary entries.
  } dictionary;
} _filenameLocalDefinitions;

Verwijzingen naar definities uit andere bestanden

Lokale definities kunnen verwijzen naar beschrijvingen die zijn gegenereerd in een ander bestand. Het bericht kan bijvoorbeeld worden gedefinieerd in het C-codebestand dat is gegenereerd op basis van het WSDL-bestand, maar het berichtelement kan elders worden gedefinieerd in het C-codebestand dat is gegenereerd op basis van het XSD-bestand. In dit geval genereert Wsutil.exe verwijzing naar het globale element uit het bestand dat de berichtdefinitie bevat, zoals hieronder wordt weergegeven:

{  // WS_MESSAGE_DESCRIPTION
...
(WS_ELEMENT_DESRIPTION *)b_xsd.globalElement.<elementname>
  };

Beschrijvingen van globale elementen

Voor elk globaal element dat is gedefinieerd in een wsdl:type- of XSD-bestand, is er een overeenkomend veld met de naam elementName in het veld GlobalElement. In dit voorbeeld wordt een structuur met de naam SimpleMethod gegenereerd:

typedef struct _SimpleServiceLocal
{
  struct  // global elements
  {
    struct // SimpleMethod
    {
    ...
    WS_ELEMENT_DESCRIPTION SimpleMethod;
    } SimpleMethod;
    ...
  } globalElements;
}

Andere beschrijvingen die door de elementbeschrijving zijn vereist, worden gegenereerd als onderdeel van de structuur die het bevat. Als het element een eenvoudig typeelement is, is er slechts één WS_ELEMENT_DESCRIPTION veld. Als het elementtype een structuur is, worden alle gerelateerde velden en structuurbeschrijvingen gegenereerd als onderdeel van de elementstructuur. In dit voorbeeld is het element SimpleMethod een structuur met twee velden, een en b. Wsutil.exe de structuur als volgt genereert:

...
struct // SimpleMethod
{
  struct // SimpleMethod structure
  {
    WS_FIELD_DESCRIPTION a;
    WS_FIELD_DESCRIPTION b;
    WS_FIELD_DESCRIPTION * SimpleMethodFields [2];
    WS_STRUCT_DESCRIPTION structDesc;
  } SimpleMethoddescs; // SimpleMethod
  WS_ELEMENT_DESCRIPTION elementDesc;
} SimpleMethod;
...

Ingesloten structuren en ingesloten elementen worden zo nodig gegenereerd als substructuren.

Wsutil.exe genereert een veld onder de sectie WSDL voor elk van de portType waarden die zijn gedefinieerd onder de opgegeven wsdl:service.

...
struct { // WSDL
    struct { // portTypeName
        struct { // operationName
        } operationName;
    ...
    WS_OPERATION_DESCRIPTION* operations[numOperations];
    WS_CONTRACT_DESCRIPTION contractDesc;
    } portTypeName;
}
...

Wsutil.exe genereert één veld f met alle beschrijvingen die nodig zijn voor de bewerking, een tekenmatrix met aanwijzers voor elke methode en één WS_CONTRACT_DESCRIPTION voor de opgegeven portType.

Alle beschrijvingen die nodig zijn voor bewerkingen worden gegenereerd in het veld operationName onder de opgegeven portType. Dit zijn het WS_ELEMENT_DESCRIPTION veld en de substructuur voor invoer- en uitvoerparameter s. Op dezelfde manier worden de WS_MESSAGE_DESCRIPTION velden voor het invoerbericht en het optionele uitvoerbericht samen met de; WS_PARAMETER_DESCRIPTION lijstveld voor alle bewerkingsparameters en het WS_OPERATION_DESCRIPTION veld voor de bewerking zelf. In dit voorbeeld wordt de codestructuur voor de Beschrijving simpleMethod gegenereerd, zoals hieronder wordt weergegeven:

...
struct // messages
{
  WS_MESSAGE_DESCRIPTION ISimpleService_SimpleMethod_InputMessage;
  WS_MESSAGE_DESCRIPTION ISimpleService_SimpleMethod_OutputMessage;
} messages;
struct // contracts
{
  struct // DefaultBinding_ISimpleService
  {
    struct // SimpleMethod
    {
      WS_PARAMETER_DESCRIPTION params[3];
      WS_OPERATION_DESCRIPTION SimpleMethod;
    } SimpleMethod;
    WS_OPERATION_DESCRIPTION* operations[1];
    WS_CONTRACT_DESCRIPTION contractDesc;
  } DefaultBinding_ISimpleService;
} contracts;
...

Namen en naamruimten die in verschillende beschrijvingen worden gebruikt, worden gegenereerd als velden van het type WS_XML_STRING. Al deze tekenreeksen worden gegenereerd als onderdeel van een constante woordenlijst per bestand. De lijst met tekenreeksen en het veld WS_XML_DICTIONARY (dict in het onderstaande voorbeeld) worden gegenereerd als onderdeel van het woordenlijstveld van de structuur fileNameLocal.

struct { // fileNameLocal
...
  struct { // dictionary
    struct { // XML string list
      WS_XML_STRING firstFieldName;
      WS_XML_STRING firstFieldNS;
      ...
    } xmlStrings;
  WS_XML_DICTIONARY dict;
  } dictionary;
}; // fileNameLocal;

De matrix van WS_XML_STRINGs wordt gegenereerd als een reeks velden van het type WS_XML_STRING, genaamd met gebruiksvriendelijke namen. De gegenereerde stub maakt gebruik van de gebruiksvriendelijke namen in verschillende beschrijvingen voor betere leesbaarheid.

Clientproxy voor WSDL-bewerkingen

Wsutil.exe genereert een clientproxy voor alle bewerkingen. Toepassingen kunnen de methodehandtekening overschrijven met behulp van een opdrachtregeloptie voor voorvoegsels.

HRESULT WINAPI bindingName_SimpleMethod(WS_SERVICE_PROXY *serviceProxy,
  WS_HEAP *heap,
  int a,
  int *b,
  int *c,
  const WS_CALL_PROPERTY* callProperties,
  ULONG callPropertyCount,
  const WS_ASYNC_CONTEXT * asyncContext,
  WS_ERROR * error )
{
  void* argList[] = {&a, &b, &c};
  return WsCall(_serviceProxy,
    (WS_OPERATION_DESCRIPTION*)&example_wsdlLocalDefinitions.contracts.DefaultBinding_ISimpleService.SimpleMethod.SimpleMethod,
    (void **)&_argList,
    callProperties,
    callPropertyCount,
    heap,
    asyncContext,
    error
  );      
}

De aanroeper van de bewerking moet een geldige heap- parameter doorgeven. Uitvoerparameters worden toegewezen met behulp van de WS_HEAP waarde die is opgegeven in de heap- parameter. De aanroepende functie kan de heap opnieuw instellen of vrijmaken om geheugen vrij te geven voor alle uitvoerparameters. Als de bewerking mislukt, kunnen aanvullende informatie over foutgegevens worden opgehaald uit het optionele foutobject als deze beschikbaar is.

Wsutil.exe genereert een service-stub voor alle bewerkingen die in binding worden beschreven.

HRESULT CALLBACK ISimpleService_SimpleMethodStub(
  const WS_OPERATION_CONTEXT *context,
  void * stackStruct,
  void * callback,
  const WS_ASYNC_CONTEXT * asyncContext,
  WS_ERROR *error )
{
  SimpleMethodParamStruct *pstack = (SimpleMethodParamStruct *) stackstruct;
  SimpleMethodOperation operation = (SimpleMethodOperation)callback;
  return operation(context, pstack->a, &(pstack->b), &(pstack->c ), asyncContext, error );
}

In de bovenstaande sectie wordt het prototype van de lokale structuur beschreven met alle definities die lokaal zijn voor het stub-bestand. In volgende secties worden de definities van de beschrijvingen beschreven.

WSDL-definitiegeneratie

Wsutil.exe genereert een constante statische structuur (const static) met de naam *<file_name>*LocalDefinitions van het type *<service_name>*Local die alle lokale alleen definities bevat.

const static _SimpleServiceLocal example_wsdlLocalDefinitions =
{
  {  // global types
  ...
  }, // global types
  {  // global elements
  ...
  }, // global elements
  {  // messages
  ...
  }, //messages
  ...
  {  // dictionary
  ...
  }, // dictionary
},

De volgende WSDL-beschrijvingen worden ondersteund:

  • wsdl:service
  • wsdl:binding
  • wsdl:portType
  • wsdl:operation
  • wsdl:message

Wsdl:operation en wsdl:message verwerken

Elke bewerking die in het WSDL-document is opgegeven, wordt door Wsutil.exetoegewezen aan een servicebewerking. Het hulpprogramma genereert afzonderlijke definities van de servicebewerkingen voor zowel de server als de client.

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Example.org" 
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://Example.org" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
 <wsdl:portType name="ISimpleService">
  <wsdl:operation name="SimpleMethod">
   <wsdl:input wsaw:Action="http://Example.org/ISimpleService/SimpleMethod" 
   message="tns:ISimpleService_SimpleMethod_InputMessage" />
   <wsdl:output wsaw:Action="http://Example.org/ISimpleService/SimpleMethodResponse" 
   message="tns:ISimpleService_SimpleMethod_OutputMessage" />
  </wsdl:operation>
 </wsdl:portType>
 <wsdl:message name="ISimpleService_SimpleMethod_InputMessage">
  <wsdl:part name="parameters" element="tns:SimpleMethod" />
 </wsdl:message>
 <wsdl:message name="ISimpleService_SimpleMethod_OutputMessage">
  <wsdl:part name="parameters" element="tns:SimpleMethodResponse" />
 </wsdl:message>
</wsdl:definitions>

De indeling van de gegevenselementen voor invoer- en uitvoerberichten wordt geëvalueerd door het hulpprogramma om de serialisatiemetagegevens voor de infrastructuur te genereren, samen met de werkelijke handtekening van de resulterende servicebewerking waaraan de invoer- en uitvoerberichten zijn gekoppeld.

De metagegevens voor elke bewerking binnen een specifieke portType hebben invoer en eventueel een uitvoerbericht, elk van deze berichten wordt toegewezen aan een WS_MESSAGE_DESCRIPTION. In dit voorbeeld worden de invoer en het uitvoerbericht voor de bewerking in portType toegewezen aan inputMessageDescription en optioneel de outputMessageDescription op de WS_OPERATION_DESCRIPTION.

Voor elk WSDL-bericht genereert het hulpprogramma WS_MESSAGE_DESCRIPTION die verwijst naar de WS_ELEMENT_DESCRIPTION definitie, zoals hieronder wordt weergegeven:

... 
{    // message description for ISimpleService_SimpleMethod_InputMessage
  (WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.DefaultBinding_ISimpleServiceISimpleService_SimpleMethod_InputMessageactionName,
  (WS_ELEMENT_DESCRIPTION*)&(WS_ELEMENT_DESCRIPTION*)&example_wsdl.globalElements.SimpleMethodReponse
},  // message description for ISimpleService_SimpleMethod_InputMessage
...

De beschrijving van het bericht verwijst naar de beschrijving van het invoerelement. Omdat het element globaal is gedefinieerd, verwijst de berichtbeschrijving naar de globale definitie in plaats van het lokale statische element. Als het element in een ander bestand is gedefinieerd, genereert Wsutil.exe ook een verwijzing naar de globaal gedefinieerde structuur in dat bestand. Als SimpleMethodResponse bijvoorbeeld is gedefinieerd in een ander bestand example.xsd, genereert Wsutil.exe in plaats daarvan het volgende:

...
{    // message description for ISimpleService_SimpleMethod_InputMessage
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.DefaultBinding_ISimpleServiceISimpleService_SimpleMethod_InputMessageactionName,
(WS_ELEMENT_DESCRIPTION*)&(WS_ELEMENT_DESCRIPTION*)&example_xsd.globalElements.SimpleMethodReponse
},  // message description for ISimpleService_SimpleMethod_InputMessage
...

Elke berichtbeschrijving bevat de actie en de beschrijving van het specifieke element (een veld van het type WS_ELEMENT_DESCRIPTION) voor alle berichtgegevenselementen. In het geval van een RPC-bericht of een bericht met meerdere onderdelen wordt een wrapper-element gemaakt om de aanvullende informatie in te kapselen.

Ondersteuning voor RPC-stijl

Wsutil.exe ondersteunt documentstijl en RPC-bewerkingen volgens de WSDL 1.1 Binding Extension voor SOAP 1.2 specificatie. RPC- en letterlijke bewerkingen worden gemarkeerd als WS_RPC_LITERAL_OPERATION. Het servicemodel negeert de naam voor het element body wrapper van het antwoord in RPC-/letterlijke bewerkingen.

Wsutil.exe biedt geen systeemeigen ondersteuning voor coderingsstijlbewerkingen. De parameter WS_XML_BUFFER wordt gegenereerd voor coderingsberichten en ontwikkelaars moeten de ondoorzichtige buffer rechtstreeks vullen.

Ondersteuning voor meerdere berichtenonderdelen

Wsutil.exe ondersteunt meerdere berichtonderdelen in één bericht. Een bericht met meerdere onderdelen kan als volgt worden opgegeven:

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Example.org" 
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://Example.org" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
 <wsdl:message name="ISimpleService_MutipleParts_InputMessage">
  <wsdl:part name="part1" element="tns:SimpleElement1" />
  <wsdl:part name="part2" element="tns:SimpleElement2" />
 </wsdl:message>
</wsdl:definitions>

Wsutil.exe genereert een WS_STRUCT_TYPE veld voor het berichtelement als het bericht meerdere onderdelen bevat. Als het bericht wordt weergegeven met behulp van de documentstijl, genereert Wsutil.exe een wrapper-element met structtype. Het wrapper-element heeft geen naam of een specifieke naamruimte en de wrapper-structuur bevat alle elementen in alle onderdelen als velden. Het wrapper-element is alleen bedoeld voor intern gebruik en wordt niet geserialiseerd in de hoofdtekst van het bericht.

Als het bericht gebruikmaakt van RPC of letterlijke stijlweergave, maakt Wsutil.exe een wrapper-element met de naam van de bewerking als de elementnaam en de opgegeven naamruimte als servicenaamruimte volgens de specificatie van de WSDL SOAP-extensie. De structuur van het element bevat een matrix met velden die de typen vertegenwoordigen die zijn opgegeven in de berichtonderdelen. Het wrapper-element wordt toegewezen aan het werkelijke bovenste element in de berichttekst, zoals aangegeven in de SOAP-specificatie.

Aan de serverzijde resulteert elke bewerking in een typedef van de resulterende serverservicebewerking. Dit typedef wordt gebruikt om te verwijzen naar de bewerking in de functietabel, zoals eerder beschreven. Elke bewerking resulteert ook in het genereren van een stub-functie die nfrastructure aanroept namens de gemachtigde aan de werkelijke methode.

typedef HRESULT (CALLBACK *SimpleMethodCallback) (
  const WS_OPERATION_CONTEXT* context,
  unsigned int  a,
  unsigned int * b,
  unsigned int * c,
  const WS_ASYNC_CONTEXT* asyncContext,
  WS_ERROR* error
  );

Voor de SimpleMethod-bewerking wordt de Typedef SimpleMethodOperation hierboven gedefinieerd. Houd er rekening mee dat de gegenereerde methode een uitgebreide argumentlijst heeft met het berichtonderdeel voor de invoer- en uitvoerbericht voor simpleMethod-bewerking als benoemde parameters.

Aan de clientzijde wordt elke bewerking toegewezen aan een proxyservicebewerking.

HRESULT WINAPI SimpleMethod (
  WS_SERVICE_PROXY* serviceProxy,
  ws_heap *heap,
  unsigned int  a,
  unsigned int * b,
  unsigned int * c,
  const WS_ASYNC_CONTEXT* asyncContext,
  WS_ERROR* error);

Verwerking wsdl:binding

Het WWSAPI-servicemodel ondersteunt de bindingsextensieSOAP. Voor elke binding is er een gekoppelde portType.

Het transport dat is opgegeven in de soapbindingsextensie, is alleen advies. De toepassing moet transportgegevens opgeven bij het maken van een kanaal. Momenteel ondersteunen we de WS_HTTP_BINDING en WS_TCP_BINDING bindingen.

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Example.org" 
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://Example.org" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
 <wsdl:binding name="DefaultBinding_ISimpleService" type="tns:ISimpleService">
  <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
  <wsdl:operation name="SimpleMethod">
   <soap:operation soapAction="http://Example.org/ISimpleService/SimpleMethod" 
   style="document" />
   <wsdl:input>
    <soap:body use="literal" />
   </wsdl:input>
   <wsdl:output>
    <soap:body use="literal" />
   </wsdl:output>
  </wsdl:operation>
 </wsdl:binding>
</wsdl:definitions>

In ons WSDL-voorbeelddocument hebben we slechts één portType voor ISimpleService. De opgegeven SOAP-binding geeft het HTTP-transport aan, dat is opgegeven als WS_HTTP_BINDING. U ziet dat deze structuur geen statische decoratie heeft, omdat deze structuur beschikbaar moet zijn voor de toepassing.

Processing wsdl:portType

Elke portType in WSDL bestaat uit een of meer bewerkingen. De bewerking moet consistent zijn met de SOAP-bindingsextensie die wordt aangegeven in wsdl:binding.

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Example.org" 
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://Example.org" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
 <wsdl:portType name="ISimpleService">
  <wsdl:operation name="SimpleMethod">
   ...
  </wsdl:operation>
 </wsdl:portType>
</wsdl:definitions>

In dit voorbeeld bevat de ISimpleService portType alleen de SimpleMethod-bewerking. Dit is consistent met de bindingssectie waarbij er slechts één WSDL-bewerking is die is toegewezen aan een SOAP-actie.

Omdat de ISimpleService portType slechts één bewerking (SimpleMethod) heeft, bevat de bijbehorende functietabel alleen SimpleMethod als een servicebewerking.

In termen van metagegevens wordt elk portType- door Wsutil.exe toegewezen aan een WS_CONTRACT_DESCRIPTION. Elke bewerking binnen een portType wordt toegewezen aan een WS_OPERATION_DESCRIPTION.

In dit voorbeeld genereert portType het hulpprogramma WS_CONTRACT_DESCRIPTION voor ISimpleService. Deze contractbeschrijving bevat het specifieke aantal bewerkingen dat beschikbaar is op de ISimpleService portType samen met een matrix van WS_OPERATION_DESCRIPTION die de afzonderlijke bewerkingen vertegenwoordigen die zijn gedefinieerd op het portType voor ISimpleService. Omdat er slechts één bewerking op ISimpleService portType voor ISimpleService is, is er ook slechts één WS_OPERATION_DESCRIPTION definitie.

...  part of LocalDefinitions structure
{    // array of operations for DefaultBinding_ISimpleService
(WS_OPERATION_DESCRIPTION*)&example_wsdlLocalDefinitions.contracts.DefaultBinding_ISimpleService.SimpleMethod.SimpleMethod,
},    // array of operations for DefaultBinding_ISimpleService
{    // contract description for DefaultBinding_ISimpleService
1,
(WS_OPERATION_DESCRIPTION**)example_wsdlLocalDefinitions.contracts.DefaultBinding_ISimpleService.operations,
WS_HTTP_CHANNEL_BINDING,
},  // end of contract description for DefaultBinding_ISimpleService
},    // DefaultBinding_ISimpleService       ...

Verwerking wsdl:service

WsUtil.exe de services gebruikt om bindings-/poorttypen te zoeken en contractstructuur te genereren waarin typen, berichten, porttypedefinities enzovoort worden beschreven. Contractbeschrijvingen zijn extern toegankelijk en worden gegenereerd als onderdeel van de globale definitiestructuur die is opgegeven via gegenereerde header.

WsUtil.exe ondersteunt EndpointReference-extensies die zijn gedefinieerd in wsdl:port. Eindpuntreferentie wordt in WS-ADDRESSING gedefinieerd als een manier om eindpunt informatie van een service te beschrijven. De verwijzingstekst van het invoereindpunt die is opgeslagen als WS_XML_STRING, samen met overeenkomende WS_ENDPOINT_ADDRESS_DESCRIPTION worden gegenereerd in de sectie endpointReferences in de globale structuur.

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Example.org" 
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://Example.org" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
 <wsdl:service name="SimpleService">
  <wsdl:port name="ISimpleService" binding="tns:DefaultBinding_ISimpleService">
   <soap:address location="http://Example.org/ISimpleService" />
   <wsa:EndpointReference>
    <wsa:Address>http://example.org/wcfmetadata/WSHttpNon</wsa:Address>
   </wsa:EndpointReference> 
  </wsdl:port>
 </wsdl:service>
</wsdl:definitions>
  const _example_wsdl example_wsdl =
  {
  ... // global element description
  {// messages
  {    // message description for ISimpleService_SimpleMethod_InputMessage
  (WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.ISimpleService_SimpleMethod_InputMessageactionName,
  (WS_ELEMENT_DESCRIPTION*)&example_wsdl.globalElements.SimpleMethod,
},    // message description for ISimpleService_SimpleMethod_InputMessage
{    // message description for ISimpleService_SimpleMethod_OutputMessage
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.ISimpleService_SimpleMethod_OutputMessageactionName,
  (WS_ELEMENT_DESCRIPTION*)&example_wsdl.globalElements.SimpleMethodResponse,
},    // message description for ISimpleService_SimpleMethod_OutputMessage
}, // messages
{// contracts
{   // DefaultBinding_ISimpleService
1,
(WS_OPERATION_DESCRIPTION**)example_wsdlLocalDefinitions.contracts.DefaultBinding_ISimpleService.operations,
WS_HTTP_CHANNEL_BINDING,
},    // end of DefaultBinding_ISimpleService
    }, // contracts
    {
        {
            {   // endpointAddressDescription
                WS_ADDRESSING_VERSION_0_9,
            },                    
            (WS_XML_STRING*)&xml_string_generated_in_stub // endpointReferenceString
        }, //DefaultBinding_ISimpleService
    }, // endpointReferences
}

Voor het maken van WS_ENDPOINT_ADDRESS met behulp van de gegenereerde WsUtil-metagegevens:

WsCreateReader      // Create a WS_XML_READER
Initialize a WS_XML_READER_BUFFER_INPUT
WsSetInput          // Set the encoding and input of the reader to generate endpointReferenceString
WsReadType        // Read WS_ENDPOINT_ADDRESS from the reader
    // Using WS_ELEMENT_TYPE_MAPPING, WS_ENDPOINT_ADDRESS_TYPE and generated endpointAddressDescription, 

Constante tekenreeksen in de clientproxy of service-stub worden gegenereerd als velden van het type WS_XML_STRING en er is een constante woordenlijst voor alle tekenreeksen in het proxy- of stub-bestand. Elke tekenreeks in de woordenlijst wordt gegenereerd als een veld in het woordenlijstgedeelte van de lokale structuur voor een betere leesbaarheid.

... // dictionary part of LocalDefinitions structure
{    // xmlStrings
  { // xmlStrings
    WS_XML_STRING_DICTIONARY_VALUE("a",&example_wsdlLocalDefinitions.dictionary.dict, 0), 
    WS_XML_STRING_DICTIONARY_VALUE("http://Sapphire.org",&example_wsdlLocalDefinitions.dictionary.dict, 1), 
    WS_XML_STRING_DICTIONARY_VALUE("b",&example_wsdlLocalDefinitions.dictionary.dict, 2), 
    WS_XML_STRING_DICTIONARY_VALUE("SimpleMethod",&example_wsdlLocalDefinitions.dictionary.dict, 3),
    ...
  },  // end of xmlStrings
  {   // SimpleServicedictionary
    // 45026280-d5dc-4570-8195-4d66d13bfa34
    { 0x45026280, 0xd5dc, 0x4570, { 0x81, 0x95, 0x4d,0x66, 0xd1, 0x3b, 0xfa, 0x34 } },
    (WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings,
    stringCount,
    TRUE,
  },
}
...

Verwerking wsdl:type

Wsutil.exe ondersteunt alleen XSD-documenten (XML-schema) in wsdl:typespecificatie. Een speciaal geval is wanneer een berichtpoort een globale elementdefinitie opgeeft. Zie de volgende sectie voor meer informatie over de heuristieken die in deze gevallen worden gebruikt.

Heuristieken voor het verwerken van parameters

In het servicemodel worden WSDL-berichten toegewezen aan specifieke parameters in een methode. Wsutil.exe heeft twee stijlen voor het genereren van parameters: in eerste stijl heeft de bewerking één parameter voor het invoerbericht en één parameter voor het uitvoerbericht (indien nodig); in de tweede stijl gebruikt Wsutil.exe een heuristiek om velden in de structuren toe te wijzen en uit te vouwen voor zowel invoerberichten als uitvoerberichten naar verschillende parameters in de bewerking. Zowel invoer- als uitvoerberichten moeten structuurtype berichtelementen hebben om deze tweede benadering te genereren.

Wsutil.exe gebruikt de volgende regels bij het genereren van bewerkingsparameters van de invoer- en uitvoerberichten:

  • Voor invoer- en uitvoerberichten met meerdere berichtonderdelen is elk berichtonderdeel een afzonderlijke parameter in de bewerking, met de naam van het berichtonderdeel als parameternaam.
  • Voor RPC-stijlbericht met één berichtonderdeel is het berichtonderdeel een parameter in de bewerking, met de naam van het berichtonderdeel als parameternaam.
  • Voor invoer- en uitvoerberichten in documentstijl met één berichtonderdeel:
    • Als de naam van een berichtonderdeel parameters is en het elementtype een structuur is, wordt elk veld in de structuur behandeld als een afzonderlijke parameter, waarbij de veldnaam de parameternaam is.
    • Als de naam van het berichtonderdeel geen parameters is, is het bericht een parameter in de bewerking met de naam van het bericht die wordt gebruikt als de bijbehorende parameternaam.
  • Voor invoer- en uitvoerbericht van documentstijl met een niet-beschikbaar element wordt het bericht toegewezen aan één parameter, met de naam van het berichtonderdeel als parameternaam. Er wordt nog een extra indirectieniveau toegevoegd om aan te geven dat de aanwijzer kan worden NULL-.
  • Als een veld alleen in het invoerberichtelement wordt weergegeven, wordt het veld behandeld als een parameter [in].
  • Als een veld alleen in het uitvoerberichtelement wordt weergegeven, wordt het veld behandeld als een [out]-parameter.
  • Als er een veld met dezelfde naam en hetzelfde type is dat wordt weergegeven in zowel het invoerbericht als het uitvoerbericht, wordt het veld behandeld als een [in,out]-parameter.

De volgende hulpprogramma's worden gebruikt om de richting van parameters te bepalen:

  • Als een veld alleen in het invoerberichtelement wordt weergegeven, wordt het veld behandeld als alleen in de parameter.
  • Als een veld alleen in het uitvoerberichtelement wordt weergegeven, wordt het veld als alleen parameter behandeld.
  • Als er een veld met dezelfde naam en hetzelfde type is dat wordt weergegeven in zowel het invoerbericht als het uitvoerbericht, wordt het veld behandeld als een in,out-parameter.

Wsutil.exe ondersteunt alleen gesequentieerde elementen. Het weigert ongeldige volgorde met betrekking tot [in,out] parameters als Wsutil.exe de parameters in parameters en uit parameters niet kan combineren in één parameterlijst. Achtervoegsels kunnen worden toegevoegd aan parameternamen om naamconflicten te voorkomen.

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Example.org" 
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://Example.org" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
 <wsdl:message name="ISimpleService_SimpleMethod_InputMessage">
  <wsdl:part name="parameters" element="tns:SimpleMethod" />
 </wsdl:message>
 <wsdl:message name="ISimpleService_SimpleMethod_OutputMessage">
  <wsdl:part name="parameters" element="tns:SimpleMethodResponse" />
 </wsdl:message>
</wsdl:definitions>

Wsutil.exe rekening houdt met velden in tns:SimpleMethod en tns:SimpleMethodResponse ato parameters, zoals te zien is in de onderstaande parameterdefinities:

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Example.org" 
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://Example.org" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
 <wsdl:types>
  <xs:schema xmlns:tns="http://Example.org" elementFormDefault="qualified" 
  targetNamespace="http://Example.org" xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:import namespace="http://Example.org" />
   <xs:element name="SimpleMethod">
    <xs:complexType>
     <xs:sequence>
      <xs:element name="a" type="xs:unsignedInt" />
      <xs:element name="b" type="xs:unsignedInt" />
     </xs:sequence>
    </xs:complexType>
   </xs:element>
   <xs:element name="SimpleMethodResponse">
    <xs:complexType>
     <xs:sequence>
      <xs:element name="b" type="xs:unsignedInt" />
      <xs:element name="c" type="xs:unsignedInt" />
     </xs:sequence>
    </xs:complexType>
   </xs:element>
  </xs:schema>
 </wsdl:types>
</wsdl:definitions>

Wsutil.exe vouwt de parameterlijst uit uit de velden in de bovenstaande lijst en genereert de ParamStruct structuur in het volgende codevoorbeeld. De runtime van het servicemodel kan deze structuur gebruiken om argumenten door te geven aan de client- en server-stubs.

typedef struct SimpleMethodParamStruct {
  unsigned int   a;  
  unsigned int   b;
  unsigned int   c;
} ;

Deze structuur wordt alleen gebruikt om het stackframe aan de client- en serverzijde te beschrijven. Er is geen wijziging in de berichtbeschrijving of in de elementbeschrijvingen waarnaar wordt verwezen door de berichtbeschrijving.

  // following are local definitions for the complex type
  { // field description for a
  WS_ELEMENT_FIELD_MAPPING,
  (WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aLocalName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aNamespace,
  WS_INT32_TYPE,
  0,
  WsOffsetOf(_SimpleMethod, a),
  0,
  0,
  },    // end of field description for a
  { // field description for b
  WS_ELEMENT_FIELD_MAPPING,
  (WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.bLocalName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aNamespace,
  WS_INT32_TYPE,
  0,
  WsOffsetOf(_SimpleMethod, b),
  0,
  0,
  },    // end of field description for b
  {    // fields description for _SimpleMethod
  (WS_FIELD_DESCRIPTION *)&example_wsdlLocalDefinitions.globalElements.SimpleMethod._SimpleMethoddescs.a,
  (WS_FIELD_DESCRIPTION *)&example_wsdlLocalDefinitions.globalElements.SimpleMethod._SimpleMethoddescs.b,
  },
  {  // structure definition
  sizeof(_SimpleMethod),
  __alignof(_SimpleMethod),
  (WS_FIELD_DESCRIPTION**)&example_wsdlLocalDefinitions.globalElements.SimpleMethod._SimpleMethoddescs._SimpleMethodFields,
  WsCountOf(example_wsdlLocalDefinitions.globalElements.SimpleMethod._SimpleMethoddescs._SimpleMethodFields),
  (WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings._SimpleMethodTypeName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aNamespace,
  0,
  },   // struct description for _SimpleMethod
  // following are global definitions for the out parameter
  ...
  {  // element description
  (WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings._SimpleMethodTypeName,
  (WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aNamespace,
  WS_STRUCT_TYPE,
  (void *)&example_wsdlLocalDefinitions.globalElements.SimpleMethod._SimpleMethoddescs.structDesc,
  },
  {    // message description for ISimpleService_SimpleMethod_InputMessage
  (WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.ISimpleService_SimpleMethod_InputMessageactionName,
(WS_ELEMENT_DESCRIPTION*)&example_wsdl.globalElements.SimpleMethod,
  },    // message description for ISimpleService_SimpleMethod_InputMessage

In de regel wordt één niveau van indirectie toegevoegd voor alle parameters [out] en [in,out].

Bewerking zonder parameters

Voor document- en letterlijke bewerkingen behandelt Wsutil.exe de bewerking als een invoerparameter en één uitvoerparameter als:

  • Het invoer- of uitvoerbericht heeft meer dan één deel.
  • Er is slechts één berichtonderdeel en de naam van het berichtonderdeel is niet 'parameters'.

.. In het bovenstaande voorbeeld, ervan uitgaande dat de berichtonderdelen de naam hebben ParamIn' en ParamOut-, wordt de methodehandtekening de volgende code:

typedef struct SimpleMethod{
unsigned int a;
unsigned int b;
};

typedef struct SimpleMethodResponse {
unsigned int b;
unsigned int c;
};

typedef  struct ISimpleService_SimpleMethodParamStruct
{
SimpleMethod  * SimpleMethod;
SimpleMethodResponse  * SimpleMethodResponse;
} ISimpleService_SimpleMethodParamStruct;

Wsutil.exe genereert een versiehandtekening voor de beschrijving van de bewerking, zodat de WsCall- en serverservicemodelengine kan controleren of de gegenereerde beschrijving van toepassing is op het huidige platform.

Deze versiegegevens worden gegenereerd als onderdeel van de WS_OPERATION_DESCRIPTION structuur. Het versienummer kan worden behandeld als een samenvoegarmselector om de structuur uitbreidbaar te maken. Op dit moment is de versionID- ingesteld op1 zonder volgende velden. Toekomstige versiosn kunnen het versienummer verhogen en indien nodig meer velden bevatten. Wsutil.exe genereert momenteel bijvoorbeeld de volgende code op basis van de versie-id:

{ // SimpleMethod
{ // parameter descriptions for SimpleMethod
{ WS_PARAMETER_TYPE_NORMAL, (USHORT)0, (USHORT)-1 },
{ WS_PARAMETER_TYPE_NORMAL, (USHORT)1, (USHORT)-1 },
{ WS_PARAMETER_TYPE_NORMAL, (USHORT)-1, (USHORT)1 },
},    // parameter descriptions for SimpleMethod
{    // operation description for SimpleMethod
1,
(WS_MESSAGE_DESCRIPTION*)&example_wsdl.messages.ISimpleService_SimpleMethod_InputMessage,
(WS_MESSAGE_DESCRIPTION*)&example_wsdl.messages.ISimpleService_SimpleMethod_OutputMessage,
3,
(WS_PARAMETER_DESCRIPTION*)example_wsdlLocalDefinitions.contracts.DefaultBinding_ISimpleService.SimpleMethod.params,
SimpleMethodOperationStub
}, //operation description for SimpleMethod
},  // SimpleMethod

In de toekomst kan het als volgt worden uitgebreid:

WS_OPERATION_DESCRIPTION simpleMethodOperationDesc =
{
  2,
  &ISimpleService_SimpleMethod_InputputMessageDesc,
  &ISimpleService_SimpleMethod_OutputMessageDesc,
  WsCountOf(SimpleMethodParameters),
  SimpleMethodParameters,
  ISimpleService_SimpleMethod_Stub,
  &forwardToString;   // just as an example.
};

Veiligheid

Zie de beveiligingssectie in het hulpprogramma Wsutil Compiler onderwerp.