Linux i Mono 2.0 timeout problem...

Nov 16, 2012 at 10:58 PM
Edited Nov 16, 2012 at 11:44 PM

Pozdrav ekipi,

isprobao sam Raverus.FiskalizacijaDEV.EXE.exe na nekoliko Linux-a (Debian,Suse,Ubuntu) i kod svih sam došao do istog, nerješivog problema.

Program radi i vraća "Status OK", ali ulazi u timeout svakih 5-20 izvršavanja (nema pravila), u trajanju 180 sekundi. Nakon toga isto spremi JIR.txt i ostale XML datoteke bez greške, te vrati "Status OK". Kada će timeout uslijediti i s čim je povezan nisam ustanovio.

Moja prilagodba:

- Samopotpisni certifikat sam instalirao komandom: certmgr -add -c Trust democacert.cer

- Mono.Security.dll kopirao u folder zajedno s Raverus.FiskalizacijaDEV.EXE.exe        

- Preradio sam “certifikat.GetSerialNumberString()” iz “potpisivanje.cs”, koja pod Linuxom daje string u hexa obliku, te je potrebno rezultat prebaciti iz: npr, “3ECB21BF” u “1253497123”.

- Ustanovio sam da timeout uslijedi prilikom prihvata odgovora servera, te sam pokušao zamjeniti ReadToEnd() sa ReadLine() u progrmu “CentralniInformacijskiSustav.cs”. U petlji sam postavio ispis na ekran broja linije i njenog sadržaja, te ustanovio da program uvijek zastane na istom mjestu, na liniji 9. Ovako izgleda dio linija s ekrana:

...
XML linija: 4  <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
XML linija: 5  <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
XML linija: 6  <Reference URI="#G0xc9f28080-4D">
XML linija: 7    <Transforms>
XML linija: 8      <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
XML linija: 9      <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>

( ovdje nastupa timeout 180 sekundi)

 

Izmjenjeni kod u “CentralniInformacijskiSustav.cs":

StreamReader readStream = new StreamReader(responseStream, encode);

//--------------------------------------------------------------------------------------------------
//string txt = readStream.ReadToEnd();        // originalni dio čitanja ...
//--------------------------------------------------------------------------------------------------
string txt = "";                        // cijeli xml...
string linija_teksta = "";          // samo jedna linija...       
int brojac = 0 ;
while (readStream.Peek() >= 0)    
{
    brojac++;
    linija_teksta = readStream.ReadLine();
    Console.WriteLine ( "XML linija: "+brojac.ToString()+ linija_teksta );           
    txt += linija_teksta;
}
//---------------------------------------------------------------------------------------------------

Nisam baš siguran u ovaj kod, ali ako neko ima ideju, molim za pomoć.

Hvala

PS: Izvršavanje EXE-a sa WinXP klijenta na Linux/Samba share-u iste verzije radi bez timeouta...

Nov 17, 2012 at 12:24 AM

da potvrdim da i kod mene na jednom racunalu stoji i ceka 180sekundi, cak i za echo,

prepravljeni zahtjev hex u dec. (<X509SerialNumber>) prolazi ali opet tih 180sekundi.....

 

na 2. racunalu je to cekanje razlicito, ali svakako predugo, istovremeno pod xp u virtualboxu sve je u redu....

Coordinator
Nov 17, 2012 at 8:02 AM

@milanb, da li je računalo na kojem imaš problema sa timeoutom isto Linux ili ... ?

Pitam ovo jer i mi u našim slanjima primjećujemo čudnu anomaliiju - naime - cca svakih 1h, vrijeme odziva od CIS-a se poveća i čini se da se radi o prilično pravilnim intervalima što je u najmanju ruku zbunjujuće i čudno. Moguće je da netko baš svakih sat vremena radi neki veće slanje dokumenata u CIS pa da je to razlog, možda je i nešto kod nas na serveru, no, možda je razlog i u nečem drugom... vrijedilo bi ti malo detaljnije ispitati :)

Vidi: https://www.fdev.hr/DevPortal/Status/Default.aspx (treba registracija)

Nov 17, 2012 at 1:46 PM

na oba dva racunala su ubuntu10.04 desktop,

na jednom racunalu se bas svaki zahtjev (echo, posaljiracun) obavi za 180,xx sekundi.

na drugom je to vrijeme promjenjivo, od par sekundi pa i do cca 200sekundi.

u virtualboxu imam xp, pa za probu posaljem u isto vrijeme slican zahtjev, tamo sve ide bez vidljivih problema, i brzo.

 

na srecu potpisivanje racuna ide, jedino onaj problem sa hex i decimalni oblik serijskog broja <X509SerialNumber>

kad to promjenim onda uspjesno prodje(za 180sek)

inace potpisani isti racun.xml u win i lin ima ive razlike:

*******************

FILE A: odg_lin.xml
FILE B: odg_win.xml
TOTALS: 2 inserted  2 deleted  55 matched

******************** REPLACE [A 46, B 46]:
          <X509Data xmlns="http://www.w3.org/2000/09/xmldsig#">
******************** WITH:
          <X509Data>

******************** REPLACE [A 49, B 49]:
              <X509SerialNumber>3ECB1AE9</X509SerialNumber>
******************** WITH:
              <X509SerialNumber>1053498089</X509SerialNumber>

******

 

mozda cu potpisani xml na lin. slati sa curl-om.

nisam doma sa .net tehnikom, ali sam razmisljao da probam kompajlirati source code na mono-u pod linux-om?

ako to netko moze, bilo bi dobro za probu.

Nov 17, 2012 at 2:29 PM

Compile pod bilo kojim Linuxom nije problem. Radi u bilo kojoj verziji (probano: Debian 6 Squeeze, Ubuntu 12, Suse Enterprise Desktop 11), Jednostavno instaliraš Mono-Develop, otvoriš .sln file iz roota Raverus sourcea, prepraviš ono osnovno (gore opisano) da bi radilo pod Linuxom, pustiš compile (f7) i imaš EXE, ali i dalje stoji 180 sekundi (random metoda: jednom ne radi, pet puta radi),

Podrav

PS. pokušavam otkriti gdje je "ručna" ali ne uspjevam

 

Nov 17, 2012 at 2:46 PM

A koliko vam je lenght responsa? 

prije streamanja responsa :

Console.WriteLine("Response Content length is {0}", response.ContentLength);

Nov 17, 2012 at 2:51 PM

Sada sam vas malo bolje pročitao i ... no comment :(

Nov 17, 2012 at 3:17 PM
Edited Nov 17, 2012 at 3:31 PM

Debian 6 + Mono 2.0 + Mono-Develop 

 

byte[] by = UTF8Encoding.UTF8.GetBytes(soapMessage.InnerXml);

request.ProtocolVersion = HttpVersion.Version11;

request.ContentLength = by.Length;


Console.WriteLine (by.Length); //------------------------------------------------------- using (Stream requestStream = request.GetRequestStream()) { requestStream.Write(by, 0, by.Length); } HttpWebResponse response = request.GetResponse() as HttpWebResponse; Console.WriteLine("Response Content length is {0}", response.ContentLength); //--------------------------------------------------------------------------

 

Rezultat:

By.length = 3989

Response Content length is -1

Pozdrav

Nov 18, 2012 at 11:10 AM
Edited Nov 18, 2012 at 11:11 AM

Za sada sam se riješio timeout-a (180 sekundi), ali tek nakon današenjeg dana i testiranja ću biti siguran.

Rješenje:

U "Raverus.FiskalizacijaDEV", "CentralniInformacijskiSustav.cs"  ubacio sam liniju "request.KeepAlive = false;" ispod "request.Method = "POST";"

 

request.ContentType = "text/xml";
request.Method = "POST";
request.KeepAlive = false;                        

 

Compile:

- MonoDevel 2.4

operater@kasa:~/temp6$ mono -V
Mono JIT compiler version 2.6.7 (Debian 2.6.7-5.1)
Copyright (C) 2002-2010 Novell, Inc and Contributors. www.mono-project.com
      TLS:           __thread
      GC:            Included Boehm (with typed GC and Parallel Mark)
      SIGSEGV:       altstack
      Notifications: epoll
      Architecture:  x86
      Disabled:      none

Nov 19, 2012 at 12:04 AM

SUPER!!!!

poslije gornje promjene/dodatka u kodu radi odlicno, koliko sam do sada vidio svi odzivi ispod sekunde, i to na onom racunalu gdje je za bas svaki odziv trebalo 180sek.

borsi, puno hvala na savjetima!

pozdrav