2010-06-07 9 views
6

Sto utilizzando BizTalk 2006 R2 per generare un riferimento Web da un file WSDL.Riferimento Web BizTalk - XSD generato ha informazioni "perse" dal WSDL

Confrontando l'XSD generato con il WSDL, è evidente che molte informazioni sono andate perse.

Si consideri il seguente estratto del WSDL:

<s:element form="unqualified" minOccurs="0" maxOccurs="4" name="Applicant"> 
    <s:complexType> 
    <s:sequence> 
     <s:element form="unqualified" minOccurs="1" maxOccurs="1" name="ApplicantIdentifier"> 
     <s:simpleType> 
      <s:restriction base="s:string" /> 
     </s:simpleType> 
     </s:element> 
     <s:element form="unqualified" minOccurs="0" maxOccurs="1" name="Name"> 
     <s:complexType> 
      <s:sequence> 
      <s:element form="unqualified" minOccurs="0" maxOccurs="1" name="Title"> 
       <s:simpleType> 
       <s:restriction base="s:string"> 
        <s:maxLength value="10" /> 
       </s:restriction> 
       </s:simpleType> 
      </s:element> 
      <s:element form="unqualified" minOccurs="0" maxOccurs="1" name="Forename"> 
       <s:simpleType> 
       <s:restriction base="s:string"> 
        <s:pattern value="[0-9A-Za-z \-]*" /> 
        <s:maxLength value="15" /> 
        <s:minLength value="1" /> 
       </s:restriction> 
       </s:simpleType> 
      </s:element> 
      <!-- more --> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
    </s:sequence> 
    </s:complexType> 
</s:element> 

Il XSD equivalente che BizTalk ha generato è:

<xs:element minOccurs="0" maxOccurs="unbounded" form="unqualified" name="Applicant"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="ApplicantIdentifier" type="xs:string" /> 
     <xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="Name"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="Title" type="xs:string" /> 
      <xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="Forename" type="xs:string" /> 
      <!-- more --> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Così, il XSD ha perso i profili di restrizione e ha stabilito i propri valori per minOccurs e maxOccurs.

Ho bisogno di mappare da un'altra fonte all'XSD e desidero intercettare i dati che non sono conformi al WSDL in quella fase.

Qualcuno sa perché BizTalk non ha conservato le restrizioni nell'XSD; o come posso generare XSD non-lossy?

+0

L'utilizzo di Xsd.exe produce gli stessi risultati? – TEEKAY

+0

Grazie per il suggerimento, TEEKAY. Quando ho indicato xsd.exe nel file WSDL: xsd.exe "C: \ Demos \ MyProblem.wsdl"/o: "C: \ Demos" Ho ricevuto l'errore "Errore: argomento della riga di comando non valido:" C: \ Demos \ MyProblem.wsdl '" Quindi ho modificato l'estensione del file per provare a ingannare xsd.exe: xsd.exe" C: \ Demos \ MyProblem.xsd "/ o:" C: \ Demos " E ho ricevuto l'errore: "Errore: può generare solo una delle classi o dei set di dati." Grazie comunque per il suggerimento. –

risposta

1

A meno che non si sta facendo la convalida dello schema in una pipeline BizTalk, restrizioni e maxOccurs> 1 non sono in realtà intenzione di fare nulla - non lo sono usato da BizTalk in fase di runtime. Sto indovinando che questo è il motivo per cui il riferimento web è in perdita.

Personalmente non mi è mai piaciuta la funzione "aggiungi riferimento web" o anche "aggiungi metadata adattatore"/WCF. Se il tuo wsdl cambia frequentemente che copiare manualmente le definizioni del tipo in un file xsd è troppo lavoro:

a) guarda alla costruzione di una semplice app per console per recuperare il wsdl, estrai il tipo (i) e aggiorna il xsd file (espellilo dal menu Strumenti esterni in VS) e

b) scopri cosa non funziona nel tuo processo di sviluppo che richiede spesso modifiche al contratto di servizio!

Problemi correlati