News:

Velkommen til FMK Teknik

Main Menu

Start problemer med FMK 1.2.6 inline WSDL

Started by aldente, 2012-08-09 10:20:38

Previous topic - Next topic

aldente

Jeg er ved at implementere FMK, og jeg udvikler i C# i Visual Studio 2005. Jeg er rendt ind i problemer ved instantiering af C# proxy klassen.

Jeg har gjort følgende:

1) Prøver at generere C# proxy:
     wsewsdl3 /type:webclient http://triforkfaellestest.lms.trifork.com/fmk12/wsdl/MedicineCard_2012_01_01.wsdl

   Giver følgende output:
     Web Services Enhancements 3.0 for Microsoft .NET.
     Copyright (c) Microsoft Corporation.

     Microsoft (R) Web Services Description Language Utility
     [Microsoft (R) .NET Framework, Version 2.0.50727.42]
     Copyright (C) Microsoft Corporation. All rights reserved.

     If you would like more help, please type "wsdl /?".

     Error: There was an error processing 'http://triforkfaellestest.lms.trifork.com/fmk12/wsdl/MedicineCard_2012_01_01.wsdl'.
     - Der opstod en fejl under hentning af 'http://triforkfaellestest.lms.trifork.com/fmk12/wsdl/MedicineCard_2012_01_01.wsdl'.
     - Anmodningen mislykkedes med HTTP-status 404: Not Found.

   Kommentar:
     Umiddelbart ser det ud til at:
     - Adgang nægtet
     - Ikke korrekt URL (det tror jeg ikke selv på)
     - WSDL filen ligger et andet sted.

   Spørgsmål:
     Hvad skal jeg gøre?

2) Downloader "Inline WSDL for FMK 1.2.6" fra "http://digitaliser.dk/resource/2325102".

3) Prøver at generere C# proxy:
     wsewsdl3 /type:webclient MedicineCard-inline_2012_01_01.wsdl

   Giver følgende output:
     Web Services Enhancements 3.0 for Microsoft .NET.
     Copyright (c) Microsoft Corporation.

     Microsoft (R) Web Services Description Language Utility
     [Microsoft (R) .NET Framework, Version 2.0.50727.42]
     Copyright (C) Microsoft Corporation. All rights reserved.
     Warning: This web reference does not conform to WS-I Basic Profile v1.1.
     R2718: En wsdl:binding i en BESKRIVELSE SKAL have det samme sæt wsdl:operations som den wsdl:portType, den refererer til.
     -  Handlingen 'UpdateMedicineCard_20120101' på portType 'MedicineCardPortType' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har ikke nogen passende bindinger.

     R2710: Operationerne i en wsdl:binding i en BESKRIVELSE SKAL medføre "wire signatures", som er forskellige. Et slutpunkt, der understøtter flere operationer skal entydigt identificere den operation, der igangsættes baseret på den modtagne inputmeddelelse. Dette er kun muligt, hvis alle de operationer, der er angivet i den wsdl:binding, som er tilknyttet et slutpunkt, har en entydig "wire signature".
     -  Inputmeddelelsen 'MedicineCardRequest' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2009/01/01:MedicineCardRequestStructure'.
     -  Inputmeddelelsen 'NewMedicineCardRequest' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2009/01/01:MedicineCardRequestStructure'.
     -  Inputmeddelelsen 'DrugMedicationRequest' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2009/01/01:DrugMedicationRequestStructure'.
     -  Inputmeddelelsen 'NewDrugMedicationRequest' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2009/01/01:DrugMedicationRequestStructure'.
     -  Inputmeddelelsen 'PrescriptionMedicationRequest' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2008/06/01:PrescriptionMedicationRequestStructure'.
     -  Inputmeddelelsen 'NewPrescriptionMedicationRequest' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2008/06/01:PrescriptionMedicationRequestStructure'.
     -  Inputmeddelelsen 'SearchWithdrawnDrugMedicationsRequest' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2009/01/01:SearchWithdrawnDrugMedicationsRequestStructure'.
     -  Inputmeddelelsen 'SearchWithdrawnDrugMedicationsRequest' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2009/01/01:SearchWithdrawnDrugMedicationsRequestStructure'.
     -  Inputmeddelelsen 'SearchEffectuationsRequest' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2009/01/01:SearchEffectuationsRequestStructure'.
     -  Inputmeddelelsen 'SearchEffectuationsRequest_20110101' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2009/01/01:SearchEffectuationsRequestStructure'.

     For more details on the WS-I Basic Profile v1.1, see the specification at http://www.ws-i.org/Profiles/BasicProfile-1.1.html.


     If you would like more help, please type "wsdl /?".

     Error: Bindingen 'MedicineCardBinding' kan ikke importeres fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01'.
     - Handlingen 'UpdateMedicineCard_20120101' på portType 'MedicineCardPortType' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' indeholder følgende syntaksfejl:  Handlingen har ikke en binding, der passer. Kontroller, om navnene på handling, input og output i afsnittet Binding passer til de tilsvarende navne i afsnittet PortType.

   Kommentar:
     Det lader til at handlingen 'UpdateMedicineCard_20120101' mangler.
     Jeg har forsøgt efterfølgende selv tilføjet handlingen og bygget en ny C# proxy.

   Spørgsmål:
     Skal jeg selv tilføje handlingen, eller findes der en opdateret version af WSDL filen?

4) Tilføjer handling 'UpdateMedicineCard_20120101' til afsnittet '<wsdl:binding>'
     <wsdl:operation name="UpdateMedicineCard_20120101">
       <soap:operation soapAction="http://www.dkma.dk/medicinecard/xml.schema/2012/01/01#UpdateMedicineCard" style="document"/>
       <wsdl:input name="UpdateMedicineCardRequest_20120101">
         <soap:header message="tns:SecurityHeader" part="SecurityHeader" use="literal"/>
         <soap:header message="tns:MedComHeader" part="MedcomHeader" use="literal"/>
         <soap:header message="tns:OnBehalfOfHeader" part="OnBehalfOfHeader" use="literal"/>
         <soap:header message="tns:SDSDSystemHeader" part="SDSDSystemOwnerName" use="literal" wsdl:required="true"/>
         <soap:header message="tns:SDSDSystemHeader" part="SDSDSystemName" use="literal" wsdl:required="true"/>
         <soap:header message="tns:SDSDSystemHeader" part="SDSDSystemVersion" use="literal" wsdl:required="true"/>
         <soap:header message="tns:SDSDSystemHeader" part="SDSDOrgResponsibleName" use="literal" wsdl:required="true"/>
         <soap:header message="tns:SDSDSystemHeader" part="SDSDOrgUsingName" use="literal" wsdl:required="true"/>
         <soap:header message="tns:SDSDSystemHeader" part="SDSDOrgUsingID" use="literal" wsdl:required="true"/>
         <soap:header message="tns:SDSDRequestedRole" part="SDSDRequestedRole" use="literal"/>
         <soap:body use="literal"/>
       </wsdl:input>
       <wsdl:output name="UpdateMedicineCardResponse_20120101">
         <soap:header message="tns:TimingHeader" part="TimingHeader" use="literal"/>
         <soap:header message="tns:ReplicationStatusHeader" part="ReplicationStatusHeader" use="literal"/>
         <soap:body use="literal"/>
       </wsdl:output>
       <wsdl:fault name="DGWSFault">
         <soap:fault name="DGWSFault" use="literal"/>
       </wsdl:fault>
     </wsdl:operation>

5) Prøver at generere C# proxy:
     wsewsdl3 /type:webclient MedicineCard-inline_2012_01_01.wsdl

   Giver følgende output:
     Web Services Enhancements 3.0 for Microsoft .NET.
     Copyright (c) Microsoft Corporation.

     Microsoft (R) Web Services Description Language Utility
     [Microsoft (R) .NET Framework, Version 2.0.50727.42]
     Copyright (C) Microsoft Corporation. All rights reserved.
     Warning: This web reference does not conform to WS-I Basic Profile v1.1.
     R2710: Operationerne i en wsdl:binding i en BESKRIVELSE SKAL medføre "wire signatures", som er forskellige. Et slutpunkt, der understøtter flere operationer skal entydigt identificere den operation, der igangsættes baseret på den modtagne inputmeddelelse. Dette er kun muligt, hvis alle de operationer, der er angivet i den wsdl:binding, som er tilknyttet et slutpunkt, har en entydig "wire signature".
     -  Inputmeddelelsen 'MedicineCardRequest' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2009/01/01:MedicineCardRequestStructure'.
     -  Inputmeddelelsen 'NewMedicineCardRequest' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2009/01/01:MedicineCardRequestStructure'.
     -  Inputmeddelelsen 'DrugMedicationRequest' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2009/01/01:DrugMedicationRequestStructure'.
     -  Inputmeddelelsen 'NewDrugMedicationRequest' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2009/01/01:DrugMedicationRequestStructure'.
     -  Inputmeddelelsen 'PrescriptionMedicationRequest' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2008/06/01:PrescriptionMedicationRequestStructure'.
     -  Inputmeddelelsen 'NewPrescriptionMedicationRequest' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2008/06/01:PrescriptionMedicationRequestStructure'.
     -  Inputmeddelelsen 'SearchWithdrawnDrugMedicationsRequest' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2009/01/01:SearchWithdrawnDrugMedicationsRequestStructure'.
     -  Inputmeddelelsen 'SearchWithdrawnDrugMedicationsRequest' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2009/01/01:SearchWithdrawnDrugMedicationsRequestStructure'.
     -  Inputmeddelelsen 'SearchEffectuationsRequest' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2009/01/01:SearchEffectuationsRequestStructure'.
     -  Inputmeddelelsen 'SearchEffectuationsRequest_20110101' fra navneområdet 'http://www.dkma.dk/medicinecard/xml.schema/2012/01/01' har "wire signature" 'http://www.dkma.dk/medicinecard/xml.schema/2009/01/01:SearchEffectuationsRequestStructure'.

     For more details on the WS-I Basic Profile v1.1, see the specification at http://www.ws-i.org/Profiles/BasicProfile-1.1.html.

     Writing file 'MedicineCard.cs'.

   Kommentar:
     C# proxy 'MedicineCard.cs' er nu genereret.
     Jeg går ud fra, at jeg skal ignorere Warninggs.

6) Filen 'MedicineCard.cs' kopieres til C# projekt folderen.

7) Projektet bygges uden problemer.

Projektet køres.
     Under instantiering af klassen MedicineCard fra C# proxyen giver følgende exception:
       System.InvalidOperationException was unhandled
       Message="Der kunne ikke oprettes en midlertidig klasse (result=1).
                error CS0030: Typen 'DeliveryInformationStructureType' kan ikke konverteres til 'OrderInstructionStructureType'
                error CS0030: Typen 'long[]' kan ikke konverteres til 'long'
                error CS0030: Typen 'long[]' kan ikke konverteres til 'long'
                error CS0030: Typen 'long[]' kan ikke konverteres til 'long'"
       Source="System.Xml"
       StackTrace:
            ved System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence)
            ved System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, XmlSerializerCompilerParameters parameters, Assembly assembly, Hashtable assemblies)
            ved System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence)
            ved System.Xml.Serialization.XmlSerializer.GetSerializersFromCache(XmlMapping[] mappings, Type type)
            ved System.Xml.Serialization.XmlSerializer.FromMappings(XmlMapping[] mappings, Type type)
            ved System.Web.Services.Protocols.SoapClientType..ctor(Type type)
            ved System.Web.Services.Protocols.SoapHttpClientProtocol..ctor()
            ved Microsoft.Web.Services3.WebServicesClientProtocol..ctor()
            ved MedicineCard..ctor() i C:\Lars\Test Projekter\FMK_Sandbox\MedicineCard.cs:linje 145
            ved FMK_Sandbox.MainForm..ctor() i C:\Lars\Test Projekter\FMK_Sandbox\MainForm.cs:linje 27
            ved FMK_Sandbox.Program.Main() i C:\Lars\Test Projekter\FMK_Sandbox\Program.cs:linje 17
            ved System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
            ved Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
            ved System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
            ved System.Threading.ThreadHelper.ThreadStart()

    Spørgsmål:
     Hvorfor denne exeption?
     Hvad skal jeg gøre for at undgå denne excpetion?


Det var vist en lang historie. men jeg håber at I kan hjælpe mig.

Venlig hilsen
Lars Klareskov
al dente

Jan Buchholdt

Hej Lars

Jeg har rettet WSDL'en med hensyn til den manglende UpdateMedicineCard_20120101, samt rettet et par andre fejl.
Jeg har lagt den ud på digitaliser.dk. Den nye wsdl+skemaer findes på http://digitaliser.dk/resource/2363987 og inline wsdl'en på http://digitaliser.dk/resource/2364001.

Dermed er punkt 3) rettet.

Punkt 1) er lidt uforståeligt for os. Hvorfor mener du at wsdl'en skulle ligge på http://triforkfaellestest.lms.trifork.com/fmk12/wsdl/MedicineCard_2012_01_01.wsdl ?

Resten er vist relateret til c# hvilket jeg ingen erfaring har med.

Hilsen Jan

aldente

Hej Jan

Mange tak for dit svar.

Jeg har hentet den nye inline WSDL på http://digitaliser.dk/resource/2364001
Jeg bygget en ny C# proxy ved hjælp af WSEWSDL3 (Microsoft), og under instantieringen af klassen MedicineCard får jeg fejlmeddelelserne (igen):
  Der kunne ikke oprettes en midlertidig klasse (result=1).
  error CS0030: Typen 'DeliveryInformationStructureType' kan ikke konverteres til 'OrderInstructionStructureType (1)
  error CS0030: Typen 'long[]' kan ikke konverteres til 'long' (2)
  error CS0030: Typen 'long[]' kan ikke konverteres til 'long' (3)
  error CS0030: Typen 'long[]' kan ikke konverteres til 'long' (4)

Jeg har undersøgt disse fejlmeddelelser intensivt og fundet ud af følgende:
Fejl (1) kan rettes i klassen CreatePrescriptionMedicationStructureType, hvor datatypen for item1Field (og tilhørende property Item1) ændres fra DeliveryInformationStructureType til object.
Fejl (2), (3) og (4) skyldes en fejl i programmet WSEWSDL3, som i visse tilfælde ikke har styr på antallet af skarpe paranteser ([]), og fejlen kan opstå, når et element har attributten 'maxOccurs="unbounded" '.
Fejl (2) kan rettes i klassen UpdateMedicineCardRequestStructureType, hvor datatypen for detachPrescriptionMedicationStructureField (og tilhørende property DetachPrescriptionMedicationStructure) ændres fra long[][] til long[].
Fejl (3) kan rettes i klassen UpdateMedicineCardRequestStructureType1, hvor datatypen for detachPrescriptionMedicationStructureField (og tilhørende property DetachPrescriptionMedicationStructure) ændres fra long[][] til long[].
Fejl (4) kan rettes i klassen UpdateMedicineCardRequestStructureType2, hvor datatypen for detachPrescriptionMedicationStructureField (og tilhørende property DetachPrescriptionMedicationStructure) ændres fra long[][] til long[].

Alle fejlene rettes i den genererede MedicineCard.cs fil.

Min inspiration til placeringen af wsdl'en er hentet fra topic af Erik F. Andersen, 2011-08-26 under 'Spørgsmål til FMK 1.2.4':
  wsewsdl3 /type:webclient http://triforkfaellestest.lms.trifork.com/fmk12/wsdl/MedicineCard_2011_01_01.wsdl


Jeg håber, at dette giver en fornuftig forklaring (for andre) på mine problemer  :) .

Hilsen
Lars Klareskov

Claus Mattsson

Det er god information Lars! Har bokset med den fejl i noget tid :) Thumbs up!