ASP NetCore - pobranie zawartości strony po wykonaniu skryptu JS

0

Witam serdecznie. Na start co udało mi się zrobić:
Po kliknięciu w przycisk Export klient zostaje przekierowany do strony, która z pomocą Html2Pdf oraz chart.js generuje plik PDF. chart.js generuje obraz wykresu po załadowaniu strony, dlatego zrobiłem counter liczący ilość wykresów. Dopiero gdy wyrenderują się wszystkie wykresy plik jest pobierany.

Teraz zagwostka:
O ile użytkownik kliknie sobie w przycisk generowania pdf to spoko, jednak raporty mają generować się dodatkowo automatycznie wraz z ostatnim dniem miesiąca. Odpada mi w tym momencie cały frontend. Czy jest możliwość załadować stronę w akcji kontrolera i wykonać skrypty? Potrzebuję choćby najmniejszej wskazówki. Dziękuję : )

0

W tym przypadku nie będzie lepiej napisać apkę konsolową czy skrypt który strzeli do odpowiedniego urla i wygeneruje ten raport? Można te narzędzie uruchomić uzywając TaskSchedulera albo np postawić sobie gdzieś HangFire i skonfigurować odpowiednie zadanie.

Możesz też pomyśleć o zaimplementowaniu BackgroundService w bebechach aplikacji ale jeśli masz więcej takich cyklicznych zadań to lepiej użyć czegoś czym łatwiej zarządzać.

0

Czy ten proces generowania raportów jest w jakiś sposób zależny od głównej aplikacji? Innymi słowy czy może działać sam, czy wymaga web aplikacji?

Jeżeli może działać sam to proponowałbym, żeby wydzielić logikę tworzenia i harmonogramowania raportów do osobnej aplikacji, nazwijmy ją ReportingService, który będzie wystawiać API HTTP dla twojego frontendu. Czyli po kliknięciu przycisku Export request leci pod adres API serwisu raportującego. Dodatkowo jeżeli ten serwis raportowy zaimplementujesz jako ASP.NET Core Web API to możesz użyć klasy BackgroundService do cyklicznego generowania raportów.

Ten background service działa jako część aplikacji, więc nie musisz nic dodatkowo uruchamiać i instalować na serwerze i całą odpowiedzialność biznesową masz w dedykowanej usłudze. Dzięki temu możesz niezależnie od frontendu wprowadzać w nim zmiany oraz, jeżeli przyjdzie ci kiedyś zmienić usługę do raportowania na coś kupnego co też wystawia API to wtedy tylko zmieniasz konfigurację we frontendzie i będzie działać.

A jak chcesz najprościej jak się (bez rozpraszania aplikacji) to odpalasz BackgroundService w twojej obecnej aplikacji odpowiedzialny za automatyczne generowanie raportów i też będzie działać.

0

Jak najbardziej da się to pohakować, pytanie tylko czy warto :D

W ostateczności zawsze możesz wejść na stronę z poziomu Selenium lub czegoś podobnego i zapisać raport :D

A nie możesz tego pdfa generować na backendzie?

0

Muszę nieco sprecyzować to co chcę osiągnąć:
Html2Pdf to biblioteka generująca pdf z kodu html działająca po stronie klienta a nie serwera. I tu wszedłem trochę na minę. Mam endpoint np. https://mypage.com/generatepdf?date=1 i on prowadzi do strony która generuje mi tego htmla. O ile mógłbym wczytać zawartość strony bezpośrednio z akcji kontrolera to jednak nie ustawia mnie to. Strona generuje pusty plik html, który jest uzupełniany przez skrypt w

<div id="reportBody"></div>
$(function() {
    // tutaj generuję całą zawartość strony włącznie z wykresami
});

Mój tok myślenia jest taki:

  1. Mam akcję kontrolera https://mypage.com/generatepdf?date=05092022
  2. Akcja w "nie wiem właśnie jaki sposób" musi w tle otworzyć daną stronę cshtml i poczekać na zakończenie skryptu.
  3. Skrypt wygeneruje widok dokumentu pdf i zamieni go w plik pdf.
  4. Tutaj już mogę bez problemu z poziomu skryptu zapisać plik do bazy danych i skorzystać z niego w innej akcji kontrolera.

Najgorszy jest punkt drugi. Jak backend ma poprzez wywołanie enpointa wczytać stronę i poczekać aż się załaduje? To jest w ogóle wykonalne?

0

@gswidwa1:

To jest w ogóle wykonalne?

Jest, bo możesz wziąć wygenerowany HTML z widoku i wrzucić go do np. Selenium, ale raczej nie chcesz tego robić.

Najprościej będzie gdy ten pdf wygenerujesz na backendzie, a nie na froncie.

Ale jeżeli już, to mógłbyś mieć background joba (zamiast w akcji kontrolera jak pisałeś wyżej) który np. raz na dzień odpala Selenium i wchodzi na ten url i zapisuje ten pdf (+jakiś delay czy cokolwiek co pozwoli określić czy wykresy się już wyrenderowały)

ale to raczej tani hack aniżeli ładne rozwiązanie :)

1
gswidwa1 napisał(a):

Muszę nieco sprecyzować to co chcę osiągnąć:
Html2Pdf to biblioteka generująca pdf z kodu html działająca po stronie klienta a nie serwera.

Chciałeś napisać generująca pdf na podstawie strony www. Dlatego musi być uruchomiona w przeglądarce. To tak, żeby doprecyzować jak ta biblioteka działa.

gswidwa1 napisał(a):

Najgorszy jest punkt drugi. Jak backend ma poprzez wywołanie enpointa wczytać stronę i poczekać aż się załaduje? To jest w ogóle wykonalne?

Najlepsze rozwiązanie to refaktoryzacja aplikacji i przeniesienie logiki generowania PDF do backendu i wtedy wybrać jeden z wariantów które zaproponowałem w poprzednim poście. Wszystko inne to hacki i powód dla którego mamy na rynku tyle beznadziejnego softu do utrzymania przy którym mało kto chce pracować i wszyscy cisną na projekty greenfield.

0

O taką odpowiedź mi chodziło. Trochę lipa ale biorę się do roboty. Kurde 3 dni pracy w plecy 🤣🍻

1 użytkowników online, w tym zalogowanych: 0, gości: 1