2009-10-07 3 views
0

J'ai besoin de poster du XML brut sur un site et lire la réponse. Avec le code suivant, je reçois toujours une erreur "Unknown File Format" et je ne sais pas pourquoi.Comment puis-je écrire un XML sur mon disque dur à GetRequestStream

  XmlDocument sampleRequest = new XmlDocument(); 
      sampleRequest.Load(@"C:\SampleRequest.xml"); 
      byte[] bytes = Encoding.UTF8.GetBytes(sampleRequest.ToString()); 

      string uri = "https://www.sample-gateway.com/gw.aspx"; 
      req = WebRequest.Create(uri); 
      req.Method = "POST"; 
      req.ContentLength = bytes.Length; 
      req.ContentType = "text/xml"; 

      using (var requestStream = req.GetRequestStream()) 
      { 
       requestStream.Write(bytes, 0, bytes.Length); 
      } 

      // Send the data to the webserver 
      rsp = req.GetResponse(); 

      XmlDocument responseXML = new XmlDocument(); 
      using (var responseStream = rsp.GetResponseStream()) 
      { 
       responseXML.Load(responseStream); 
      } 

Je suis assez certain que ma question est ce que/comment je vous écris au requestStream si ..

Comment puis-je modifier ce code afin que je puisse écrire un fichier XML situé sur le disque dur à la demande de flux?

+0

Quelle ligne de code renvoie l'exception? Quel est le type exact de l'exception? Peut-être poster la pile d'appel. – Brannon

+0

Sur quelle ligne obtenez-vous l'erreur? – AnthonyWJones

+0

L'erreur est trouvée dans le fichier responseXML. – swolff1978

Répondre

2

ok au lieu de faire sampleRequest.ToString(), vous devez utiliser sampleRequest.OuterXml, et qui ferait la magie, vous envoyez "System.Xml.XmlDocument" au lieu du Xml

XmlDocument sampleRequest = new XmlDocument(); 
    sampleRequest.Load(@"C:\SampleRequest.xml"); 
    //byte[] bytes = Encoding.UTF8.GetBytes(sampleRequest.ToString()); 
    byte[] bytes = Encoding.UTF8.GetBytes(sampleRequest.OuterXml); 
0

Deux choses:

D'abord, chaque fois que vous essayez de diagnostiquer un problème avec une réponse HTML, vous devriez toujours examiner ce que le flux de réponse contient réellement. Si vous aviez dans ce cas, vous auriez vu qu'il contient System.Xml.XmlDocument, ce qui vous aurait dit ce qui n'allait pas tout de suite. Deuxièmement, dans une application avec n'importe quel type de volume de transaction, vous ne voudrez pas charger un fichier XML statique dans un XmlDocument avant de le placer dans le flux de réponse; le temps passé par votre programme et la construction de la mémoire de quelque chose dont vous n'avez pas besoin. (C'est encore pire que ça dans votre cas: votre approche non seulement analyse le XML dans un objet DOM, mais effectue une copie en mémoire de sa propriété OuterXml lorsque vous l'encodez en UTF-8. faites-vous cela?) Au lieu de cela, vous devez créer un objet FileStream et utiliser l'une des techniques du this answer pour le copier dans le flux de réponse.

+0

J'apprécie toutes les informations - je suis toujours un peu un programmeur vert alors pardonnez-moi si je dis quelque chose de stupide, mais voici: nous n'allons pas charger un document du disque dur, nous le construisons dans un autre méthode, mais la méthode va retourner un XmlDocument, êtes-vous en train de dire que la méthode qui construit le XmlDocument devrait renvoyer autre chose qu'un XmlDocument? Quel est le meilleur moyen d'obtenir le XML dans le flux dans ce cas? – swolff1978

+0

Oh, non, c'est génial de construire un XmlDocument en mémoire. Le code que vous avez posté charge le XmlDocument à partir du disque, c'est ce que je supposais que vous essayiez de faire. Si vous avez déjà l'objet XmlDocument, j'écrirais simplement sa propriété OuterXml dans le flux de réponse. –

Questions connexes