Laden...

Datentypdekl. in WSDL mit VS:C# konsumieren

Erstellt von Banzai666 vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.272 Views
B
Banzai666 Themenstarter:in
5 Beiträge seit 2009
vor 15 Jahren
Datentypdekl. in WSDL mit VS:C# konsumieren

Hallo C#-Gemeinde,

wiedereinmal qäult mich ein C#-Problem und ich bin's leid, den ganzen Tag mit google'n zu verbringen und 50.000 Treffer nach meinem Problem zu durchforsten (evtl. bin ich auch zu doof, das richtige Search-Pattern zu finden?).

Zuerst das Problem bzw. Fehlermeldung bei Aufruf einer Funktion der durch VS generierten Wrapperklasse aus einer Web-Referenz:

"Ein Objekt des Typ WebService.meinedatenbank.DriverInfoItem kann nicht einem Objekt des Typs WebService.meinedatenbank.DriverInfoItem[] zugewiesen werden."

Die Typ-Definition in der WSDL:

:
:
<wsdl:types>
		<xs:schema targetNamespace="http://new.webservice.namespace" elementFormDefault="qualified">
			<xs:complexType name="DriverInfoArray">
				<xs:annotation>
					<xs:documentation>Element: Contains a list of driver information from database</xs:documentation>
				</xs:annotation>
				<xs:sequence>
					<xs:element name="items" type="tns:DriverInfoItem" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:complexType>
			<xs:element name="DriverInfo" type="tns:DriverInfoItem">
				<xs:annotation>
					<xs:documentation>Element: Contains detailed driver information from database</xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:complexType name="DriverInfoItem">
				<xs:annotation>
					<xs:documentation>Typedefinition: Contains detailed driver information from database</xs:documentation>
				</xs:annotation>
				<xs:sequence>
					<xs:element name="Pid" type="xs:int"/>
					<xs:element name="Identifier" type="xs:string"/>
					<xs:element name="Forename" type="xs:string"/>
					<xs:element name="Lastname" type="xs:string"/>
					<xs:element name="eMail" type="xs:string"/>
				</xs:sequence>
			</xs:complexType>
		</xs:schema>
	</wsdl:types>
:
:

Ein SOAP-Request auf die entsprechende Methode liefert brav ein (für mich logisches) Ergebnis:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="tns:new.webservice.namespace" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="http://new.webservice.namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
	<SOAP-ENV:Body>
		<ns1:GetDriverListResponse>
			<return xsi:type="ns2:DriverInfoArray">
				<items xsi:type="ns2:DriverInfoItem">
					<Pid xsi:type="xsd:int">0</Pid>
					<Identifier xsi:type="xsd:string">0</Identifier>
					<Forename xsi:type="xsd:string">Archie 0</Forename>
					<Lastname xsi:type="xsd:string">Var 0</Lastname>
					<eMail xsi:type="xsd:string">depp@sepp_0_.de</eMail>
				</items>
				<items xsi:type="ns2:DriverInfoItem">
					<Pid xsi:type="xsd:int">1</Pid>
					<Identifier xsi:type="xsd:string">1</Identifier>
					<Forename xsi:type="xsd:string">Archie 1</Forename>
:
:
:
					<Lastname xsi:type="xsd:string">Var 9</Lastname>
					<eMail xsi:type="xsd:string">depp@sepp_9_.de</eMail>
				</items>
			</return>
		</ns1:GetDriverListResponse>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

VS erstellt dafür folgende Klasse:

/// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.1433")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.SoapTypeAttribute(Namespace="http://new.webservice.namespace")]
    public partial class DriverInfoArray {
        
        private DriverInfoItem[] itemsField;
        
        /// <remarks/>
        [System.Xml.Serialization.SoapElementAttribute(IsNullable=true)]
        public DriverInfoItem[] items
        {
            get {
                return this.itemsField;
            }
            set {
                this.itemsField = value;
            }
        }
    }

Die mir so auch recht sinnig erscheint.

Mit der o.a. Fehlermeldung hat C# nicht ganz unrecht, weil ein DriverInfoItem -Objekt nunmal kein Array von DriverInfoItem-Objekten ist.

Meine Vermutung ist, daß in der WSDL die Typ-Definition etwas 'angepaßt' werden muß, wobei mir allerdings die Ideen ausgegangen sind. Eventuell ist auch die PortType bzw. die Bindings in der WSDL für C# verkehrt. Die hab ich mal extra nicht gepostet, weil man die jetzt mit den vorhandenen Angaben 'heraus'-definieren können müsste und ich vllt. ein paar Vorschläge dafür bekomme.
Deswegen das Thema auch in "Webtechnologien" und nicht "C#"....

Vielen Dank für eure Bemühungen und evtl. Antworten und Hilfestellungen. Wenn noch Code-Stücke benötigt werden, poste ich die gerne nach.

Banzai

BTW: Eines meiner Mottos: "Ich muss den Code nicht verstehen, aber funktionieren muss es."

458 Beiträge seit 2007
vor 15 Jahren

BTW: Eines meiner Mottos: "Ich muss den Code nicht verstehen, aber funktionieren muss es."

Denkbar schlechtes Motto..

be the hammer, not the nail!

B
Banzai666 Themenstarter:in
5 Beiträge seit 2009
vor 15 Jahren

@aequitas:

Danke für diese äußerst hilfreiche Bemerkung. Das werde ich sofort ausprobieren:
Ich fang mit über 40 nochmal an, mein Abitur nachzuholen, Informatik zu studieren, meine Doktorarbeit in Webtechnologien zu machen und schließlich das Wissen zu haben um 5% eines Programmes zum laufen zu bringen, welches noch dieses Jahr fertig werden sollte und in ein paar Jahren eh wieder veraltet ist. Super effektiv!

Danke, daß du mir die Augen geöffnet hast!

Banzai

S
82 Beiträge seit 2008
vor 15 Jahren

Dann beauftrag doch einen Progger 😉

Es geht in diesem Forum eben darum, Hilfe zu bekommen und nicht fertigen Code zu bekommen. Demnach ist die Aussage von aequitas schon soweit richtig, getreu dem Motto:

Fische jemanden einem Fisch, und er überlebt einen Tag, bringe ihm das Fischen bei, und er überlebt sein Leben lang (oder so ähnlich) 😉

3.003 Beiträge seit 2006
vor 15 Jahren

Die geposteten Codeschnippsel sind soweit völlig in Ordnung.

Zuerst das Problem bzw. Fehlermeldung bei Aufruf einer Funktion der durch VS generierten Wrapperklasse aus einer Web-Referenz:

(Hervorhebung von mir) Kannst du das mal genauer (mit Code) erläutern?

LaTino
Versteh' bitte, dass dein Nachsatz so rüberkam wie "schreibt mir nur die Lösung auf, ich will nicht selber denken." Dass das nicht so gemeint war, kann ja sein. Versteh nur, dass es so ankommen kann.

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

B
Banzai666 Themenstarter:in
5 Beiträge seit 2009
vor 15 Jahren

@LaTino:

Danke schon mal für die Antwort.

Der Aufruf:

DriverInfoArray di = m_MDLogService.GetDriverList(); // Hier Exception
                    for (int i = 0; i < di.items.Length; i++)
                    {
                        DriverInfoItem dItem = (DriverInfoItem)di.items[i];
                        
                        System.Diagnostics.Debug.WriteLine(
                            String.Format("Id: {0}\nName: {1}\nVorname: {2}\neMail: {3}\nIdent: {4}",
                        dItem.Pid, dItem.Lastname, dItem.Forename, dItem.eMail, dItem.Identifier)
                        );
                    }

...und was VS als Funktion erstellt hat:

/// <remarks/>        [System.Web.Services.Protocols.SoapRpcMethodAttribute("urn:#GetDriverListOperation", RequestNamespace="tns:new.webservice.namespace", ResponseNamespace="tns:new.webservice.namespace")]
        [return: System.Xml.Serialization.SoapElementAttribute("return")]
        public DriverInfoArray GetDriverList() {
            object[] results = this.Invoke("GetDriverList", new object[0]);
            return ((DriverInfoArray)(results[0]));
        }

@alle:
Einen fix und fertigen Code will ich ja garnicht und man kann diese auch garnicht von projektfremden Personen erwarten. Es reicht ja schon ein Denkanstoß oder ein Hinweis auf eine Lösung, an die ich bisher nicht gedacht habe.
Bloß wenn ich für ein Problem irgendwo ein fertiges Code-Schnippsel erwische, das funktioniert, dann nehm ich sowas gerne in Anspruch, weil es nichts anderes ist, als sich eine DLL aus dem INet zu ziehen, die einem ein Problem löst, ohne vorher das ganze studiert zu haben und nochmal neu zu erfinden.

PS: Ignoriert mich einfach. Ich bin ein alter Mann mit dünnem Nervenkostüm und einem Hang zu ausschweifenden Reden ohne Sinn und schaffe es immer wieder irgendwo anzuecken.

Vielen Dank für die Mühe, ich werde eine andere Lösung finden müssen.

Bye Bye