Az cégnél, akiknek dolgozom, lehetősége van minden ügyfélnek arra, hogy XML file-okat egy oldalra feltöltve, a cégtől termékinformációt, rendeléseket, vagy akár számlaadatokat kapjanak meg. Azonban eddig erre semmi átfogó megoldás nem volt, mivel a cég csak az interfészt és a szolgáltatást adta, program nem volt, ami ezt megfelelően ki is használta volna. Azonban a tesztelés, és újabban az egyre több ilyen jellegű felkérés miatt, úgy gondoltam, hogy érdemes lenne csinálni egy kis progit, amivel tudom én magam is tesztelni a rendszer működését.
Így kerültem kapcsolatba azzal, hogy az MSXML 2.4es verzió megkerülésével, C# alapon hogyan is lehetne csinálni web-es feltöltést, és utána válaszfeldolgozást. Nos összerittyentettem gyorsan egy kis felületet, ahol a kedves felhasználó beírja a usn/psw párost, és PNArequestet (készlet és ár információ) tud küldeni, amennyiben tudja a termék sku-ját és mennyiségét.
Magát az XML file-t nem is generálom le, egyszerűen egy stringbe íratom az egészet, amit egy külön osztályban tárolok. Ez nem a legjobb megoldás, mivel korlátos, de tesztelésre pont elegendő.
na de nem ezért írtam blogbejegyzést, hanem maga a feltöltés miatt: elkövettem ugyanis egy pár hibát.
HttpWebRequest xmlRequest = (HttpWebRequest)WebRequest.Create("https://im-xml.com/receiveXML.ASP");
Ez még jónak tűnik, de a későbbiekben meglátjuk, hogy helytelen...
xmlRequest.Method = "POST";
xmlRequest.ContentType = "text/xml";
byte[] xmlByteStream = Encoding.UTF8.GetBytes(rtbXMLText.Text);
Stream xmlStream = xmlRequest.GetRequestStream();
xmlStream.Write(xmlByteStream, 0, xmlByteStream.Length);
xmlStream.Close();
Ez meg maga a küldésért felelős rész. Beállítom, hogy POST típusú tranzakciót, azaz küldést követnék el, méghozzá "text/xml" típusú tartalommal, majd a kis xml file-ocskám szövegét UTF8as kódolású byte tömbbé konvertálom. Miért ezzé? Mert ezt lehet megadni egy Streamnek bemenetnek, amivel majd feltöltöm a webhelyre :) (persze ekkor még jóhiszeműen gondoltam, hogy így fel lehet... :-)) végül lezárom a streamet és kész.
Hogy hol hibádzott a dolog? több helyen is.
A hibaüzenet az volt, hogy "Cannot send a content-body with this verb-type". És a stream létrehozásánál akadt meg. Ez a hibaüzi elvileg olyankor jön elő, ha mondjuk GET-tel szeretnél küldeni, viszont itt a Method jól láthatóan POST volt. Hol van tehát a hiba? ...
Kutakodás, és nem kevés baráti segítség (Kösz Boo :-)) árán végül sikerült megoldani a helyzetet. A hiba kétrétű volt:
- HttpWebRequest nem XML küldésre való. Sima WebRequestet kell alkalmazni ilyenkor
- A kódolási mizéria elkerülése érdekében a direkt Stream helyett lehet StreamWritert is használni - sokkal egyszerűbb, kezelhetőbb.
string uri = "https://im-xml.com/receiveXML.asp";
WebRequest xmlreq = WebRequest.Create(uri);
xmlreq.Method = "POST";
xmlreq.ContentType = "text/xml";
StreamWriter srw = new StreamWriter(xmlreq.GetRequestStream());
srw.WriteLine(xth.GetXMLText());
srw.Close();
ahol az xth.GetXMLTest() csak az XML stringet adja vissza. A feltöltés így már rendben lefut, a szerver válaszol, egy egyszerű StreamReaderes kis játékkal ki is lehet olvasni:
WebResponse xmlrsp = xmlreq.GetResponse();
StreamReader srr = new StreamReader(xmlrsp.GetResponseStream());
string fullresponse = srr.ReadToEnd();
Most már csak a kedves felhasználó jogait, akinek a nevében küldöm kell megnézzem, hogy a szerverről ne egy hibaüzi jöjjön vissza... :-)
Tanulságul szolgáljon mindazoknak, akik beleütköznek ilyen hibába esetleg, és hogy használj StreamReadert/Writert sima Stream helyett.
~~~
Nincsenek megjegyzések:
Megjegyzés küldése