[.NET \ C#]Web-service data type

Pagina: 1
Acties:

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Ik ben bezig een webservice aan het maken en ik heb een webmethod
code:
1
2
3
4
5
6
7
[WebMethod]
public XmlDocument getXmlDocument()
{
    XmlDocument xml = new XmlDocument();
    //hier wat code om het xml document te vullen
    return xml;
}

als ik deze echter probeer aan te roepen in mijn applicatie dan vind visual studio dat ik geen XmlDocument als return value van de methode getXmlDocument() krijg maar een XmlNode. Nou heb ik geprobeerd om deze gewoon te casten naar een XmlDocument maar dan krijg ik een invalid cast exception. Weet iemand mischien hoe ik toch een XmlDocument als return value kan geven van mijn WebMethod?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • tomato
  • Registratie: November 1999
  • Niet online
Kun je een voorbeeldje geven van waar je deze method aanroept?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
code:
1
XmlDocument xml = webservice.getXmlDocument();

als ik dit aanroep krijg ik al een compiler error dat de return value een XmlNode is in plaats van een XmlDocument. Ik heb het dus op dit moment ook echt zo simpel als het hier staat. Omdat het eerst niet werkte heb ik in de webmethod ook alle code verwijderd die het XmlDocument zou moeten vullen en ik doe ook geen bewerkingen in mijn applicatie op het XmlDocument.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • tomato
  • Registratie: November 1999
  • Niet online
Hmmm, kun je de exacte error dan misschien geven?

Gaat het ook fout als je alleen de method implementeert en hem niet aanroept?

XmlDocument is wel een extension van de XmlNode class, dus eigenlijk is een XmlDocument instantie ook een XmlNode object. Maar omdat je hier toch expliciet het type XmlDocument gebruikt (en als return type opgeeft) lijkt me het gewoon juist wat je doet...

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Error:
Cannot implicitly convert type 'System.Xml.XmlNode' to 'System.Xml.XmlDocument'


En als ik de methode niet aanroep dan krijg ik geen foutmelding. Als ik neerzet
code:
1
XmlNode node = webservice.getXmlDocument();

dan krijg ik ook geen error. Maar als ik hem dan probeer te casten naar XmlDocument dan krijg ik een invalid cast exception. Ik heb even in de soap messages gekeken en bij de defenitie van het return type van de methode staat ook
code:
1
2
3
4
5
6
7
8
9
10
11
12
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope //wat irrelevante info weggehaald voor layout>
  <soap:Body>
    <getXmlDocumentResponse xmlns="http://tempuri.org/">
    <getXmlDocumentResult>xml</getXmlDocumentResult>
    </getXmlDocumentResponse>
  </soap:Body>
</soap:Envelope>

daar geeft hij dus aan dat het return type xml is en niet dat het een XmlNode of een XmlDocument is dus ik denk dat visual studio die defenitie leest en automatisch denkt dat het een XmlNode is of iets in die richting. Ik heb ook geprobeert om als parameter een XmlDocument mee te geven en dan heb ik bij de webservice hetzelfde probleem dan begint hij ook te klagen dat het een XmlNode is in plaats van een XmlDocument.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • tomato
  • Registratie: November 1999
  • Niet online
Ik heb geen ervaring met SOAP in .NET, dus verder kan ik er niet zo veel over zeggen. Het lijkt me overigens geen fout van Visual Studio.

Misschien dat iemand anders er wat meer in ziet?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Nee ik denk ook niet dat het een fout is van visual studio want de compiler staat daar los van want die hoort gewoon bij het framework. Ik denk dat ik maar een andere manier ga zoeken om het xml document over te sturen. Ik ga wel proberen een XmlNode over te sturen en dan zelf in de applicatie in een nieuwe XmlDocument te hangen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • tomato
  • Registratie: November 1999
  • Niet online
rwb: En als ik de methode niet aanroep dan krijg ik geen foutmelding. Als ik neerzet
code:
1
XmlNode node = webservice.getXmlDocument();

dan krijg ik ook geen error.
Dus het is een XmlNode wat je krijgt. Aangezien XmlNode zelf een abstract class is moet het object dat je terug krijgt van het type van een van de derived classes van XmlNode zijn:
code:
1
2
3
4
5
6
XmlAttribute
XmlDocument
XmlDocumentFragment
XmlEntity
XmlLinkedNode
XmlNotation
Maar als ik hem dan probeer te casten naar XmlDocument dan krijg ik een invalid cast exception.
Dat is op zich wel logisch, je kunt niet casten naar een specifieker type (XmlNode -> XmlDocument).

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Op maandag 15 juli 2002 15:46 schreef tomato het volgende:
Dat is op zich wel logisch, je kunt niet casten naar een specifieker type (XmlNode -> XmlDocument).
waarom zou dit niet kunnen. Je moet alleen wel eerst even controleren of het echt wel een specefieker type is.
code:
1
2
object test = "test";
string test2 = (string)test;

hier cast ik ook naar een specefieker type (object -> string)
en dat werkt ook gewoon. Inderdaad als een instantie van XmlNode zou zijn die hij returned dan zou het inderdaad niet kunnen. Maar volgens mijn methode specificatie zou het wel degelijk een XmlDocument moeten zijn. Maar als ik dus het volgende doe
code:
1
getXmlDocument() is XmlDocument

levert dat ook false op. Wat er dus op wijst dat het return type geen XmlDocument is. Maar het vreemde is dat ik dat wel zo gedeclareerd heb. Ik heb nog even gekeken welk type XmlNode het is dat ik terug krijg door het te printen. En ik krijg dus een XmlElement terug in plaats van een XmlDocument.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • tomato
  • Registratie: November 1999
  • Niet online
rwb: waarom zou dit niet kunnen. Je moet alleen wel eerst even controleren of het echt wel een specefieker type is.
Pardon me for talking nonsense :o

Da's natuurlijk juist wat je met een cast doet ;)
En ik krijg dus een XmlElement terug in plaats van een XmlDocument.
Ah, die is via XmlLinkedNode derived van XmlNode...

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Op maandag 15 juli 2002 16:13 schreef tomato het volgende:

[..]

Pardon me for talking nonsense :o

Da's natuurlijk juist wat je met een cast doet ;)
foutje ken natuurlijk gebeuren.
Ah, die is via XmlLinkedNode derived van XmlNode...
inderdaad. Op zich klopt het allemaal behalve dat hij geen XmlDocument terug geeft maar een XmlElement. Als ik zelf dan weer een XmlDocument aanmaak en dan met appendChild die XmlElement probeer toe te voegen dan krijg ik een exception dat dat element uit een andere document context komt en dat dat niet mag.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1