C#, Webservice, XL API, Access Violation

Zapytania SQL, widoki, Crystal, definicje filtrów, szybkich raportów, wydruków, API, Hydra, .NET

Moderator: mikey

yakhub
Posty: 91
Rejestracja: 25 lis 2008, 16:41
Rola: Administrator CDN XL
Wersja: 9.2

C#, Webservice, XL API, Access Violation

Post autor: yakhub »

Mam aplikację, która udostępnia webservice WCF.

Webservice udostępnia metody do tworzenia i edytowania dokumentami XLa przez API.

Wszystko było stabilne jak skała, i potrafiło działać miesiącami bez ingerencji, aż do upgradu XLa do wersji 2016.

Na początku aplikacja wysypywała się od razu - dopisałem:

Kod: Zaznacz cały

        [DllImport("ClaRUN.dll")]
        public static extern void AttachThreadToClarion(int x);
A potem: AttachThreadToClarion(1); przed każdym wywołaniem funkcji API. Zdawało mi się, że pomogło. Miałem rację - zdawało mi się.

Teraz aplikacja działa przez kilkanaście godzin, w międzyczasie wystawiane są dokumenty, wszystko działa - aż nagle, zupełnie bez powodu, wszystko wylatuje w powietrze (zazwyczaj w środku nocy, gdy na magazynie pracuje 3 zmiana):
https://www.dropbox.com/s/x2zidq54lk18u ... 1.jpg?dl=0


Błąd występuje w zupełnie losowych momentach. Nie jest przechwytywany przez bloki try/catch. Już zupełnie nie wiem, co z tym zrobić.

Ktoś ma jakieś pomysły, co jeszcze można z tym zrobić?

rafalW
Posty: 60
Rejestracja: 15 sty 2012, 14:13
Rola: Inny
Lokalizacja: Puławy

Re: C#, Webservice, XL API, Access Violation

Post autor: rafalW »

Przejrzyj stare tematy, juz pisalem parokrotnie, api jest jednowatkowe, webserwis nie. Wywolywanie AttachThreadToClarion w kazdej metodzie nic nie da bo liczy sie watek w ktorym zrobiles logowanie
Musisz przerobic aplikacje, napisac serwis windowsowy, w jednym watku obsluga api, w drugim komunikacja z webserwisem, miedzy nimi kolejka fifo.

yakhub
Posty: 91
Rejestracja: 25 lis 2008, 16:41
Rola: Administrator CDN XL
Wersja: 9.2

Re: C#, Webservice, XL API, Access Violation

Post autor: yakhub »

Taka informacja, dla osób, które będą się w przyszłości zmagać z problemem: To nie jest tak wprost, że API jest jednowątkowe.

Kolejne wywołania funkcji API mogą pochodzić z różnych wątków, i będzie to działać. Warunek jednak jest taki, że przez cały czas musi być aktywny wątek, w którym miało miejsce logowanie.

Stąd też wynika pozornie nieprzewidywalne zachowanie webservice'ów - podczas kolejnych wywołań metod mogą (choć nie muszą) być tworzone nowe wątki, a stare mogą (choć nie muszą) być zwalniane, lub używane ponownie. Na mechanizm, który tym zarządza mamy niewielki wpływ, a działa on niedeterministycznie. To, jak to będzie działać, zależy od tego, kiedy zostanie zwolniony wątek, w którym nastąpiło logowanie. Praktycznie nie sposób przewidzieć, kiedy to nastąpi, ale - jeżeli logowanie nastąpiło w wyniku requestu - mamy praktycznie pewność, że prędzej, czy później nastąpi.

elmiq
Posty: 1025
Rejestracja: 23 sie 2010, 10:04
Rola: Administrator CDN XL
Lokalizacja: Warszawa

Re: C#, Webservice, XL API, Access Violation

Post autor: elmiq »

Czyli, dla uproszczenia, jest jednowątkowe, bo musisz się trzymać wątku w którym poszło logowanie. Najprościej to porównać do uruchomionego modułu XL. Jeśli masz włączoną sprzedaż (w danej bazie), to wywołasz sobie różne listy/okna, nawet wielokrotnie (powiedzmy metody), ale samej sprzedaży dla tej bazy drugi raz nie włączysz (czyli wątku logowania). Dlatego też chyba najprościej i najbardziej Comarcho-odpornie skorzystać z rady Rafała.

Pozdrawiam,
Mateusz
Mateusz Świerkosz

http://elmiq.blogspot.com/

rafalW
Posty: 60
Rejestracja: 15 sty 2012, 14:13
Rola: Inny
Lokalizacja: Puławy

Re: C#, Webservice, XL API, Access Violation

Post autor: rafalW »

yakhub pisze:To nie jest tak wprost, że API jest jednowątkowe.
Klocic sie nie chce, tym bardziej ze na dowod mam tylko wlasne obserwacje, faktem jest jednak ze jak robilem testy wielowatkowe (utworz dokument, dodaj kilka towarow, zamknij dokument), to np 100 watkow puszczone na zywiol zawsze konczylo sie spektakularnym wybuchem. Dopiero po dolozeniu semafora zaczynalo dzialac tak jak powinno
Sam tez przyznales ze kolejne wywolania AttachThreadToClarion nic nie daja, dla mnie to kolejny dowod ze api ma jeden watek na klienta i oczekuje ze klient tez bedzie jednowatkowy. A to ze pozwala na wywolania z innych watkow dopoki watek logowania zyje? W sumie cholera wie jak ten caly Clarion dziala, mozemy gdybac do rana

Mateusz juz napisal, ja powtorze. Zrobienie obslugi api w jednym watku jest Comarcho-odporne i na dluzsza mete zwyczajnie sie oplaca. We wczesniejszych wersjach webserwisu jeszcze dla XLa ze starym interfejsem, obsluge api mialem w webserwisie. Kazde wywolanie to nowa sesja, nowy watek. I dzialalo, ale nie w 100% skutecznie. Raz na jakis czas w logach pojawialy sie przypadkowe bledy, nigdy powtarzalne. Niby nic, klient dostawal blad, probowal jeszcze raz i nie bylo sprawy. Ale niesmak pozostal... ;)
Po przerzuceniu api do serwisu windowsowego jak reka odjal, logi czysciutkie, hula normalnie jak nie Comarch ;)

aczapnik
Posty: 7
Rejestracja: 23 sie 2013, 14:21
Rola: Administrator CDN XL
Wersja: 2015
Lokalizacja: Kołobrzeg

Re: C#, Webservice, XL API, Access Violation

Post autor: aczapnik »

Szukając więcej informacji o AttachThreadToClarion znalazłem transmisję z Clarion Live Open Webinar http://www.clarionlivemedia.com/webinar ... -11-11.wmv
W trakcie pojawia się temat API i pokazany jest fragment dokumentacji - dołączam zrzut ekranu - może komuś się przyda kilka zdań więcej na temat funkcji AttachThreadToClarion()
Załączniki
Screenshot_2.jpg
Pozdrawiam
Artur Czapnik
Comarch ERP XL 2016.3...

PlacekJ
Posty: 15
Rejestracja: 25 sty 2016, 15:55
Rola: Inny

Re: C#, Webservice, XL API, Access Violation

Post autor: PlacekJ »

rafalW pisze:
25 sty 2017, 07:57
yakhub pisze:To nie jest tak wprost, że API jest jednowątkowe.
Po przerzuceniu api do serwisu windowsowego jak reka odjal, logi czysciutkie, hula normalnie jak nie Comarch ;)
Odgrzebuję bo właśnie z tym walczę.
Próbowałem uruchomić web api na Self-Host uruchomionej jako Win Service z logowaniem w klasie serwisu ale jakoś bez rezultatów.

Mam pytanka.
Jak technicznie realizujesz te kolejkę FIFO z web api do win service?
Potrzebuję aby web api ostatecznie zwracało do klienta numer utworzonego dokumentu w XL lub opis błędu. W twoim rozwiązaniu z win service da się to zrobić?
Twój win service loguje się do XL-a przy uruchomieniu i trzyma sesję czy logowanie jest dla każdego elementu z FIFO?

Pozdrawiam.

john_doe
Posty: 649
Rejestracja: 26 maja 2008, 22:15
Rola: Inny

Re: C#, Webservice, XL API, Access Violation

Post autor: john_doe »

rafalW daj info jak to jest infrastrukturalnie u Ciebie.

Czy my tutaj nie mówimy o:
1. Servis Windowsowy pracujący tylko z XL, sprawdzający co chwilę czy coś jest do roboty wg jakiejś daty? Jeśli tak to robi = loguje się. dodaje dokument, modyfikuje, etc...
2. Jakiś REST`ik obsługujący calle http, zapis do db, do koleki tego co w pkt 1

?

havoc
Posty: 45
Rejestracja: 24 sty 2019, 09:10
Rola: Inny
Wersja: 2019

Re: C#, Webservice, XL API, Access Violation

Post autor: havoc »

Ad 1. Tak tez robię podobnie u siebie. Kolejkuję w bazie danych i odczytuje albo z win service albo z aplikacji wywołanej z harmonogramu zadań. Działa bez problemów. Minusem jest opóźnienie w wykonaniu zadania (service czy aplikacja odpytuje co jakiś czas bazę po prostu). W przyszłości spróbuję przetestować jakiegoś Rabbita czy Kafkę.
Ad 2. Nie udało mi się zbyt skutecznie odpalić się jednowątkowo w ASP.NET MVC i ASP.NET Web API (co wcale nie znaczy ze nie jest to możliwe). Zapytania 'RESTowe' do XL API obsługuję ciągle w ASP.NET Web Forms (AspCompat="true").

rafalW
Posty: 60
Rejestracja: 15 sty 2012, 14:13
Rola: Inny
Lokalizacja: Puławy

Re: C#, Webservice, XL API, Access Violation

Post autor: rafalW »

Czesc
Przepraszam ze tak po roku, nie zagladam tu zbyt czesto :oops:
PlacekJ pisze:
16 wrz 2019, 10:03
Jak technicznie realizujesz te kolejkę FIFO z web api do win service?
john_doe pisze:
25 wrz 2019, 15:06
1. Servis Windowsowy pracujący tylko z XL, sprawdzający co chwilę czy coś jest do roboty wg jakiejś daty? Jeśli tak to robi = loguje się. dodaje dokument, modyfikuje, etc...
2. Jakiś REST`ik obsługujący calle http, zapis do db, do koleki tego co w pkt 1 ?
Mniej wiecej tak jak piszesz, z tym ze bez udzialu bazy. Komunikacja miedzy web a win serwisem opiera sie u mnie na socketach tcp/ip. Winserwis jest serwerem, a webserwis klientem. Webserwis SOAP na IIS (pisalem to ladnych kilka lat temu, REST nie byl wtedy jeszcze popularny). Po wywolaniu metody w websvc tworze komunikat z unikalnym id i wysylam go do winsvc. Serwer tcp jest wielowatkowy, wiec po odebraniu komunikatu w winsvc umieszczam go w kolejce (System.Collections.Queue)
W watku api sprawdzam cyklicznie kolejke, jesli cos jest to wykonuje odpowiednia akcje api, a nastepnie tworze komunikat zwrotny ktory trafia do websvc
PlacekJ pisze:
16 wrz 2019, 10:03
Twój win service loguje się do XL-a przy uruchomieniu i trzyma sesję czy logowanie jest dla każdego elementu z FIFO?
Loguje sie raz i trzyma sesje aby uniknac sytuacji ze zabraknie licencji

ODPOWIEDZ