Greška Kod slanja soap poruke

Nov 27, 2012 at 11:23 AM
Edited Nov 27, 2012 at 11:24 AM

Koristim Clarion i Raverus.FiskalizacijaDEV.COM.dll.

Kreiram sljedeći xml:

<?xml version="1.0" encoding="UTF-8"?><tns:RacunZahtjev xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://www.apis-it.hr/fin/2012/types/f73" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="signXmlId" ><tns:Zaglavlje><tns:IdPoruke>20cb572b-4cf4-49a8-b623-571e8e882db6</tns:IdPoruke><tns:DatumVrijeme>27.11.2012T12:12:24</tns:DatumVrijeme></tns:Zaglavlje><tns:Racun><tns:Oib>12345678901</tns:Oib><tns:USustPdv>false</tns:USustPdv><tns:DatVrijeme>27.11.2012T12:12:24</tns:DatVrijeme><tns:OznSlijed>N</tns:OznSlijed><tns:BrRac><tns:BrOznRac>39</tns:BrOznRac><tns:OznPosPr>Posl1</tns:OznPosPr><tns:OznNapUr>1</tns:OznNapUr></tns:BrRac><tns:Pdv><tns:Porez><tns:Stopa>25.00</tns:Stopa><tns:Osnovica>10.00</tns:Osnovica><tns:Iznos>2.50</tns:Iznos></tns:Porez></tns:Pdv><tns:IznosUkupno>100.00</tns:IznosUkupno><tns:NacinPlac>G</tns:NacinPlac><tns:OibOper>11827268330</tns:OibOper><tns:ZastKod>e360d2cdc0485b82fc33d18e6a590f96</tns:ZastKod><tns:NakDost>false</tns:NakDost></tns:Racun></tns:RacunZahtjev>

 

Zatim preko proc. 'PosaljiSoapPorukuCertifikatDatoteka' pošaljem xml na cis i u DebugViewu mi javi sljedeću grešku:

'Greška kod slanja SOAP poruke. Primljen odgovor od CIS-a, detalji greške u CentralniInformacijskiSustav.OdgovorGreska. '

 

E sad, zanima me kako doći do greške?

Proc PosaljiSoapPorukuCertifikatDatoteka vrati prazan string.

 

 TNX

Tomislav

Coordinator
Nov 27, 2012 at 11:43 AM

Probaj DohvatiSifruGreske odnosno DohvatiPorukuGreske

Nov 27, 2012 at 7:29 PM
Edited Nov 27, 2012 at 7:30 PM

Iz clariona bi to tribalo izgledat otprilike ovako:

 

 1. RacunOdgovorXml = PosaljiSoapPorukuCertifikatDatoteka( RacunZahtjevxml, certifikat, sifra)

 2. GreškaPoruka =  DohvatiPorukuGreske(RacunOdgovorXml,'RacunOdgovor')

 

U slučaju npr.  da Oib korisnika ne odgovara Oibu Certifikata, CIS vrati xml s Opisom/šifrom greške itd.

Problem je što funkcija 'PosaljiSoapPorukuCertifikatDatoteka' ne vrati ništa osim poruke u DebugViewu:

'Greška kod slanja SOAP poruke. Primljen odgovor od CIS-a, detalji greške u CentralniInformacijskiSustav.OdgovorGreska. '.

Tako je i RacunOdgovorXml iz linije 1 prazan pa 2. linija koda nema smisla, odnosno ne bi vratila ništa.

 

Način na koji sam ja došao do RacunOdgovorxml-a(greške) je tako da sam dodao sljedeću liniju koda u proc. SendSoapMessage(XmlDocument soapMessage):

 

 

 WebResponse ipakPristigliErrorXmlResponse = ((WebException)ex).Response;
                if (ipakPristigliErrorXmlResponse != null)
                {
                    using (Stream noviResponseStream = ipakPristigliErrorXmlResponse.GetResponseStream())
                    {
                        StreamReader responseReader = new StreamReader(noviResponseStream);
                        OdgovorGreska = new XmlDocument();
                        OdgovorGreska.Load(responseReader);
                        Raverus.FiskalizacijaDEV.PopratneFunkcije.XmlDokumenti.SnimiXmlDokumentDatoteka(OdgovorGreska, @"D:\OdgovorGreska1.xml");  // DODANO
                        Trace.TraceError("Gre�ka kod slanja SOAP poruke. Primljen odgovor od CIS-a, detalji gre�ke u CentralniInformacijskiSustav.OdgovorGreska. ");
                        throw;
                    }
                }
                else
                {
                    Trace.TraceError(String.Format("Gre�ka kod slanja SOAP poruke. Status gre�ke (prema http://msdn.microsoft.com/en-us/library/system.net.webexceptionstatus.aspx): {0}. Poruka gre�ke: {1}", ex.Status, ex.Message));
                    throw;
                }

 

Zanima me postoji li lakši način dolaska do Greške.

Unaprijed se ispričavam, ako ne vidim nešto očito jer sam u C# totalni početnik.

Hvala

 

Nov 27, 2012 at 9:26 PM

Sada sam malo pogledao izvorni kood COMa.

Možda bi trebali metodu "DohvatiPorukuGreske" dodatno preopteretiti, pa kada se pozove bez xml stringa, a samo s tipom dokumenta, da vrati string greške iz xml-a "OdgovorGreska".

Isto vrijedi i za "DohvatiSifruGreske".

Nov 28, 2012 at 9:15 AM

Pozz svim sudionicima razvoja ovog projekta!

Ista stvar.. Poziv iz Clariona COM kontrola

"PosaljiSoapPorukuCertifikatDatoteka" - ukoliko je xml neispravan dobijem nazad prazan string, tako da DohvatiSifruGreske odnosno DohvatiPorukuGreske niti ne mogu vratiti odgovor sifru ili poruku greske.

Nov 28, 2012 at 9:18 AM

Isto to radi sa bilo cim da se pozove COM.
Ja trenutno imam istu stvar sa VB6.0 starom aplikacijom.

Zato sam otvorio ISSUE TRACKER

http://fiskalizacija.codeplex.com/workitem/687

 

Nov 28, 2012 at 10:33 AM

To vam je zato sto vi iz COMa uopće ne možete dohvatiti sadržaj propertya "OdgovorGreska". Nije mi jasno kak' to do sada niste skužili :)).

Nov 28, 2012 at 1:45 PM
mladenbabic wrote:

To vam je zato sto vi iz COMa uopće ne možete dohvatiti sadržaj propertya "OdgovorGreska". Nije mi jasno kak' to do sada niste skužili :)).

Zar proc. 'PosaljiSoapPorukuCertifikatDatoteka' ne bi trebala vratiti RacunOdgovorXML i u slučaju greške. Problem je što ne vraća ništa, prazan string?

Nov 28, 2012 at 2:00 PM
Edited Nov 28, 2012 at 2:14 PM

Pa gledao sam u koodu, ako dodje do WebExceptiona, onda se stream odgovora sa sadržajem poruke greške, dovuče u property XmlDocument tipa pod nazivom "OdgovorGreska" - ali - vi si sadržaj iz tog propertya, koliko vidim, ne možete nigdje dohvatiti -  a kako bi ga poslije uputili u metodu za parsiranje greške i dobili kood ili tekst opisa greške.

Ako prodje bez greške, onda se stream odgovora puni  "soapMessage" property (mislim da se tako zove, nemam sada kood pred sobom), znači drugačiji property, i taj se sadrzaj vraca iz metode - i onda vam je sve ok.

Dakle, postoji nekoliko načina da se ovo riješi. Jedan od načina sam dao u svom gornjem postu. U tom bi slučaju scenario bio takav, da kada je redovni XML odgovor prazan, samo s tipom dokumenta pozoves parser, a on, ako nema dostavljenog mu xml stringa, preuzme (po tipu) string opisa greske (ili broj) i vratiti samo takav (od XMLa očišćeni) string.

Ja u svom "fiskalizacijskom" dll-u imam poseban oError object u koji trpam sve fiskalizacijske greške, a u aplikaciji koja ga konzumira samo nakon bilo kojeg poziva provjerim njegov property lError, pa ako je on true, u cErrorMsg imam string s detaljnim opisom greske. Jednostavno i univerzalno.

Nov 28, 2012 at 4:13 PM

Ahaaa ..skužija san. Hvala na opširnom odgovoru :)

Prosljedit ću tvoj prijedlog na glasovanje

Nov 28, 2012 at 4:29 PM
Edited Nov 28, 2012 at 4:30 PM

Samo daj.

Coordinator
Nov 28, 2012 at 8:41 PM
Edited Nov 28, 2012 at 8:42 PM
mladenbabic wrote:

Ja u svom "fiskalizacijskom" dll-u imam poseban oError object u koji trpam sve fiskalizacijske greške, a u aplikaciji koja ga konzumira samo nakon bilo kojeg poziva provjerim njegov property lError, pa ako je on true, u cErrorMsg imam string s detaljnim opisom greske. Jednostavno i univerzalno.

yep..

Na isti način sam definirao DataContract objekt sa WCF, koji ima sve propertije kao tvoj interfejs... isSucces - koji ako je false, onda je neka banana u pitanju.. i onda upućujem metodu da provjeri što ima u propertijima "kod greške" i/ili "opis greške"...

U svakom slučaju, dobro je razdvojiti i definirati klasu ili interfejs greške pa trpati u nju sve što možeš dobiti ako procedura kihne iz nekog razloga, čisto da sebi olakšaš muke kasnije, a i pregledan je kood :)

Dobar savjet zlata vrijedi ;)