J'essaie d'écrire un .NET IIS à l'aide du service web System.ServiceModel
l'espace de noms. Mon service doit lire le fichier startTag
à partir du paquet entrant en tant que XML RAW plutôt qu'en tant que nœud désérialisé. .NET mais je n'arrive pas à le faire. Voici un exemple SOAP paquet :
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:tmk="http://schemas.datacontract.org/2004/07/TMK.Catalog">
<soapenv:Header/>
<soapenv:Body>
<tem:Catalog>
<tem:document>
<tmk:CHRMAS03>
<startTag>
<myTag>
<answer>Hello world!</answer>
</myTag>
</startTag>
</tmk:CHRMAS03>
</tem:document>
</tem:Catalog>
</soapenv:Body>
</soapenv:Envelope>
Et voici mon service web :
using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Xml.XPath;
[ServiceContract]
public interface IContract
{
[OperationContract]
string Catalog(Point document);
}
[DataContract]
public class Point
{
[DataMember]
public XPathDocument CHRMAS03;
public Point (XPathDocument document)
{
this.CHRMAS03= document;
}
}
public class Service1 : IContract
{
public string Catalog (Point document)
{
if(document.CHRMAS03!=null)
{
try
{
XPathNavigator navigator = document.CHRMAS03.CreateNavigator();
XPathNodeIterator iterator1 = navigator.Select("startTag/myTag/answer");
if(iterator1==null) {return "crash"; }
int a = iterator1.Count; // Exception!
return "success";
}
catch(Exception e)
{
return e.Message + e.StackTrace;
}
}
return "fail";
}
Lorsque j'envoie le paquet spécifié ci-dessus à mon service web, cette ligne :
int a = iterator1.Count
lance une exception :
Object reference not set to an instance of an object.
at MS.Internal.Xml.Cache.XPathDocumentNavigator.get_NameTable()
at MS.Internal.Xml.Cache.XPathDocumentElementChildIterator..ctor(XPathDocumentNavigator parent, String name, String namespaceURI)
at MS.Internal.Xml.Cache.XPathDocumentNavigator.SelectChildren(String name, String namespaceURI)
at MS.Internal.Xml.XPath.ChildrenQuery.Advance()
at MS.Internal.Xml.XPath.ChildrenQuery.Advance()
at MS.Internal.Xml.XPath.ChildrenQuery.Advance()
at MS.Internal.Xml.XPath.Query.MoveNext()
at MS.Internal.Xml.XPath.Query.get_Count()
at TMK.Catalog.Service1.Catalog(Point document)
Comment redéfinir le CHRMAS03
afin qu'il prenne le contenu XML brut du champ startTag
en tant que chaîne de caractères que je peux analyser manuellement ou en tant qu'instance de travail de n'importe quelle norme. .NET classe de lecture XML , tels que XmlReader
o XmlNode
?