Autor Beitrag
kingdave2nd
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Fr 03.07.09 11:27 
Hallo zusammen,

ich habe einen .NET Webservice geschrieben, der folgende Methode implementiert:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
        [WebMethod]
        [SoapInclude(typeof(MdbPropertyOfNullableInt32)), SoapInclude(typeof(MdbPropertyOfString))]
        public MdbGetObjectListReply GetObjectList(MdbGetObjectListRequest getObjectListRequest)
        {
            if (getObjectListRequest.Application.ApplicationId == 0 || getObjectListRequest.ObjectName == null || getObjectListRequest.Schema.SchemaId == 0 || getObjectListRequest.ServerInfo == null)
                throw new WsiException("Mandatory properties are not filled.");
            else
            {
                MdbGetObjectListReply objectListReply = new MdbGetObjectListReply(getObjectListRequest.ServerInfo);
                objectListReply.ObjectList = conn.GetObjectList(getObjectListRequest.Application, getObjectListRequest.Schema, getObjectListRequest.ObjectName, ticket.UserId);
                return objectListReply;
            }
        }


Nun wird im "objectListReply" eine Liste vom Typ "MdbProperty" zurückgegeben. Von "MdbProperty" wird "MdbPropertyOfNullableInt32" und "MdbPropertyOfString" abgeleitet. Das passiert alles in der 78sten DLL irgendwo im Backend. Nun erhalte ich immer die Fehlermeldung auf dem Client:

ausblenden Quelltext
1:
System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type Tooma.Provider.Db.dbobjects.MdbPropertyOfNullableInt32 was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.					


Gut, das würde ja auch irgendwie Sinn machen, woher soll die WSDL auch von den beiden abgeleiteten Objekten wissen. Allerdings ändert sich auch nichts, wenn ich den Eintrag
ausblenden C#-Quelltext
1:
        [SoapInclude(typeof(MdbPropertyOfNullableInt32)), SoapInclude(typeof(MdbPropertyOfString))]					

über der Methode GetObjectList aufnehme. Ich dachte, dass dann automatisch diese beiden Typen in der WSDL aufgenommen werden.

Die einzige Chance, mich irgendwie daran vorbeizuhangeln, ist die WSDL zu zwingen die beiden Typen aufzunehmen in dem ich irgendwelche Dummy Methoden in den Webservice baue, die einfach mal einen leeren "MdbPropertyOfNullableInt32" und "MdbPropertyOfString" zurückgeben. Aber das kann ja keine dauerhafte Lösung sein. Irgendwelche Hinweise, was ich da noch falsch mache?

gruss Dave
kingdave2nd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Di 14.07.09 08:16 
Hi zusammen,

hat hier wirklich keiner eine Idee? Ich komme immer noch nicht weiter mit dem Thema und die sonst so hilfsbereite Mama Google läst mich hier auch im Stich....


Gruss Dave
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 14.07.09 10:22 
Eigentlich sollte SoapInclude aber funktionieren. Wie bindest du den WebService denn in deinem Client ein, per WebReference oder per "WSDL erzeugte Klasse(n)"?

Ich selber hatte auch einfach mal Dummy-Methoden erstellt, um die fehlenden Typen einzubinden (das klappt ja auf jeden Fall).
kingdave2nd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Di 14.07.09 10:38 
Mmmh, ich binde den Webservice über die Webreferenz ein. Wie funktioniert denn die zweite Methode?

Die Lösung mit den Dummy Methoden mag ich eigentlich gar nicht. Auch wenn es soweit keine Auswirkungen hat, sieht das doch irgendwie doof aus, wenn man dann irgendwann 30 dummy Methoden im Intellisense oder in der Beispielwebsite des Service hat....

gruss Dave
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 14.07.09 12:32 
Hast du schon mal versucht, die WebReferenz zu entfernen und neu hinzuzufügen?

Mittels "WSDL.exe" kann man sich eine Datei (.cs) erzeugen lassen, in der dann alle (exportierten) Klassen enthalten sind und diese Datei dann statt der WebReferenz in das Projekt einbinden.

Aufruf dann z.B. so:
ausblenden Quelltext
1:
"C:\Programme\Microsoft Visual Studio 8\SDK\v2.0\Bin\wsdl.exe" /out:WebService.cs /namespace:WebService http: //localhost/WebService.asmx?wsdl // edit: statt http://, da sonst als link erkannt -(					


Ok, bei 30 Klassen würde ich mir wohl auch einen anderen Weg suchen als dafür dann jeweils eine Dummy-Methode zu erstellen...
kingdave2nd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Fr 17.07.09 07:49 
Hi,

ich habe meine Webservice noch mal neu angefangen (ich üb noch ein wenig ;-) ) daher musste ich das Scenario noch mal nachbauen.

Im Webservice ist jetzt die folgende Methode enthalten:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
     [WebMethod]
        [SoapInclude(typeof(TestChild))]
        public TestBase Test()
        {
            TestChild c = new TestChild();
            c.TestB = "BaseString";
            c.TestC = "ChildString";
            return (TestBase)c;
        }


In einer DLL im Backend befinden sich die beiden Klassen TestBase und TestChild. Testen tu ich das ganze direkt im debugging im IE 7, also ohne jede Clientkomponente (und somit auch keine Webreferenz mehr nötig). Die Exception läuft auch dort wie zuvor beschrieben auf. Ich habe (wie du beschrieben hast) mit wsdl.exe mal die test.cs erzeugt, die an diesen Eintrag angehangen ist. Im ganzen Dokument "TestChild" leider nirgendwo erwähnt.

Gruss Dave
Einloggen, um Attachments anzusehen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 17.07.09 10:21 
Hallo kingdave2nd,

ich habe es jetzt auch mal nachgestellt und zuerst dieselbe Fehlermeldung bekommen:
Zitat:

Use the XmlInclude or SoapInclude attribute...


Und die Lösung ist ganz einfach:
ich habe einfach XmlInclude benutzt und schon funktioniert es (sowohl beim Aufruf als auch in der generierten .cs-Datei sind nun alle Klassen aufgelistet)

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
[WebMethod]
[XmlInclude(typeof(TestChild))]
public TestBase Test()
{
    TestChild c = new TestChild();
    c.TestB = "BaseString";
    c.TestC = "ChildString";
    return c; // cast ist hier unnötig
}


warum SoapInclude nicht funktioniert, weiß ich aber leider nicht...

Sorry, daß du solange auf das falsche Pferd gesetzt hast (ich hätte es selber mal eher testen müssen -).
kingdave2nd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Fr 17.07.09 11:22 
Hi,

super vielen Dank für die Hilfe es tut. Kann mir auch nicht erklären warum SoapInclude da nicht tut. Aber was solls, das Ergebniss zählt und meine dummy Methoden können jetzt endlich verschwinden.

FREU JUBEL KREISCH :D

Gruss Dave