Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

C# WCF Genereert verkeerde singleWsdl

Pagina: 1
Acties:

Verwijderd

Topicstarter
Op dit moment loop ik tegen een probleem aan met het gebruik van WCF en de automatische generatie van een Wsdl en een singleWsdl.

Ik heb een behavior aangemaakt die een header toe kan voegen aan een WCF service.
Deze behavior implementeert de interface IWsdlExportExtension en daarin de methode ExportEndpoint.
Deze methode laadt de xsd van de header in en voegt deze toe aan de wsdl. (Voorbeeldproject met het probleem is hier te vinden: https://drive.google.com/...3S25rc2c/view?usp=sharing Het toevoegen van de xsd aan de wsdl zit in de class IncomingWsdlExport)

De xsd die wordt toegevoegd:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.randomsite.nl/Header"
            xmlns:rgh="http://www.randomsite.nl/Header">
  <xsd:element name="Header">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="rgh:HeaderVersion"/>
        <xsd:element ref="rgh:MessageId"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="HeaderVersion">
    <xsd:annotation>
      <xsd:documentation>Version of the header
      </xsd:documentation>
    </xsd:annotation>
    <xsd:simpleType>
      <xsd:restriction base="xsd:string"/>
    </xsd:simpleType>
  </xsd:element>
  <xsd:element name="MessageId">
    <xsd:annotation>
      <xsd:documentation>Id of the message
      </xsd:documentation>
    </xsd:annotation>
    <xsd:simpleType>
      <xsd:restriction base="xsd:string">
        <xsd:maxLength value="30"/>
      </xsd:restriction>
    </xsd:simpleType>
  </xsd:element>
</xsd:schema>


Resultaat:
De gegenereerde wsdl krijgt netjes de header in de wsdl

Snippet uit de wsdl:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<xsd:schema targetNamespace="http://www.randomsite.nl/Header">
    <xsd:element name="Header">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="rgh:HeaderVersion"/>
                <xsd:element ref="rgh:MessageId"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="HeaderVersion">
        <xsd:annotation>
            <xsd:documentation>Version of the header</xsd:documentation>
        </xsd:annotation>
        <xsd:simpleType>
            <xsd:restriction base="xsd:string"/>
        </xsd:simpleType>
    </xsd:element>
    <xsd:element name="MessageId">
        <xsd:annotation>
            <xsd:documentation>Id of the message</xsd:documentation>
        </xsd:annotation>
        <xsd:simpleType>
            <xsd:restriction base="xsd:string">
                <xsd:maxLength value="30"/>
            </xsd:restriction>
        </xsd:simpleType>
    </xsd:element>
</xsd:schema>


Dit stuk ontbreekt echter in de singleWsdl.
SoapUI genereert het volgende request voor de Wsdl:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:head="http://www.randomsite.nl/Header" xmlns:ser="http://www.asite.com/Service1/">
   <soapenv:Header>
      <head:Header>
         <head:HeaderVersion>?</head:HeaderVersion>
         <head:MessageId>?</head:MessageId>
      </head:Header>
   </soapenv:Header>
   <soapenv:Body>
      <ser:GetData>
         <!--Optional:-->
         <ser:value>?</ser:value>
      </ser:GetData>
   </soapenv:Body>
</soapenv:Envelope>


en dit request voor de singleWSDL:
XML:
1
2
3
4
5
6
7
8
9
10
11
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:head="http://www.randomsite.nl/Header" xmlns:ser="http://www.asite.com/Service1/">
   <soapenv:Header>
      <head:Header/>
   </soapenv:Header>
   <soapenv:Body>
      <ser:GetData>
         <!--Optional:-->
         <ser:value>?</ser:value>
      </ser:GetData>
   </soapenv:Body>
</soapenv:Envelope>


Zoals te zien is missen in de singleWSDL de velden HeaderVersion en MessageId in de header.
Ik kan niet verklaren waarom de singleWSDL niet goed wordt gegenereerd, ik heb op internet ook niets kunnen vinden om specifiek de singleWsdl aan te passen. Is er hier iemand die dit kan verklaren?

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Behaviors worden runtime pas bepaald, dus daar kan de code generator nooit rekening mee houden natuurlijk. Ik weet niet precies wat je wilt bereiken, maar je zou een behavior voor de client kunnen implementeren die die data weer uit de header vist?

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Verwijderd

Topicstarter
Dat klopt, maar de (single)Wsdl wordt ook runtime gegenereerd. Afbeeldingslocatie: http://i57.tinypic.com/2ng9ycy.png

Deze generatie gebeurd pas op het moment dat de service geopend wordt. Als ik een breakpoint plaats in de class IncomingWsdlExport zie ik ook dat deze geraakt wordt. En dat de gewone wsdl goed gegenereerd wordt. Alleen de singleWsdl lijkt niet te veranderen, hoe je de export ook implementeert.