Jak zapisać wszystkie żądania HTTP użytkownika w bazie?

0

Witam.
Borykam się z pewnym problemem w middleware. Domyślam się, że to jest "by design", ale czy jest szansa i czy jest sens drążyć temat.

Napisałem "tracer" poczynań użytkownika w WebAPI. Przy każdym wywołaniu endpointu leci wpis do tabeli, kto, kiedy, gdzie i co zrobił. Problemem zaczęło się przechwytywanie HttpContext.Request.Body, ponieważ robiąc funkcję z ReadToEndAsync() powoduje błędy, zwłaszcza na metodzie POST kiedy chce odczytać obiekt jaki ma być zapisany do bazy. To samo chciałbym zrobić z odczytywaniem body w metodzie GET, ale czy to nie jest jakiś niepotrzebny overkill żeby takie rzeczy zapisywać? Błąd sugerował, że po zrobieniu ReadToEndAsync(), całe body się "zerowało" i leciało dalej puste.

Mam bardzo dziwną klientele i wole mieć wszystkie możliwe asy i jokery w rękawie stąd taka nadgorliwość w tracingu.

0

Na czym to stoi?

0

Jeśli pytasz o hosting to IIS, jeśli o bazę danych to SQL Server 2022, System Windows Server

0
AdamWox napisał(a):

Jeśli pytasz o hosting to IIS, jeśli o bazę danych to SQL Server 2022, System Windows Server

Chodziło o hosting. To nie lepiej jakieś logowanie na poziomie IISa włączyć?

0

Też jest wyjście w sumie, ale nie chciałbym, aby ktoś mógł sobie otworzyć plik, bo domyślam się, ze jak IIS to tylko do pliku 🤔 Myślałem jeszcze o Serilog i wybrać Seq jako sink. Tam jest logowanie, można by to przekierować na porcie na routerze i mieć dostęp zewsząd. Jak klient przymarudzi, że "nie działa" to pyk odpalam logi i wytykam mu błędy, bo przecież moje oprogramowanie jest bezbłędne ✌️

1

To IIS jeszcze żyje ? Sądziłem że został odstawiony w nowych wersjach języka ...

Nie neguję, czasem trzeba pracować w czymś starszym / stabilnym / dobrze zakorzenionym, ale skąd ta gonitwa do .NET 8?

0

Nowy projekt, pisany od zera. Nie widziałem żadnych przeciwskazań żeby od razu przejść na .NET 8 i Angular 17. A IIS tylko dlatego, ze to musi być hosting Windowsowy, ponieważ piszę oprogramowanie pod Comarch Optima i korzystam z plików DLL tego oprogramowania i Optima musi być na maszynie hostującej zainstalowana i działająca. Odpadają dockery i ogólnie linuxy

1

Tym bardziej bym wyczekująco podchodził to świeżutkiego Frameworku

0

W skrócie to jest prosty CRUD do zarządzania zleceniami. What could go wrong 🤔😅

2
AnyKtokolwiek napisał(a):

To IIS jeszcze żyje ? Sądziłem że został odstawiony w nowych wersjach języka ...

A żyje, żyje. Dlaczego jako webserver miałby nie żyć?

Nawet Azure w App Service'ach - czyli sztandarowej usłudze do hostowania web apek - wciąż używa IIS jako webserver :)
Najważniejsze że nowe .NETy nie są do nie przyspawane i mogą być hostowane gdziekolwiek.

2

Tutaj jest napisane jak mozna odczytac HttpContext.Request.Body wiele razy.

Framework ma tez HTTP logging middleware, ktory loguje requesty do pliku(moze daloby rade przeslac logi do bazy zamiast pliku; moze Interceptors by pomogly to zrobic, sam sie tym nie bawilem ale moze sie uda no chyba ze jest to kwestia konfiguracji)

0

@AdamWox Z ciekawości, a dlaczego nie np. openTelemetry? Od tego to jest, wszystko masz zaimplementowane. Też byle kto się nie dostanie do tego.

0

@Dregorio ja właśnie nie wiem co i jak się teraz robi. Ten middleware był pierwszym pomysłem na jaki wpadłem i ma pewne wady, stąd cały ten post.

@xarix Z linku wynika, że powinno się używać HttpContext.Request.BodyReader, bo wtedy jest to odpowiednio obsłużone po stronie .NET. Jeśli chcemy skorzystać z HttpContext.Request.Body to wtedy trzeba dodać linijkę z EnableBuffering(). I pewnie, u mnie, brak tej linijki powoduje problemy.

2

Miałem kiedyś ten sam problem i z tego co pamiętam to rozwiązało problem

context.Request.EnableBuffering();
context.Request.Body.Position = 0;
0

@AdamWox Możesz np. wykorzystać spany, które są częścią trace. Dzięki temu szukasz po traceId i dostajesz pełen przebieg co dany user robil.
Tutaj jest demo. C# też jest, możesz się pobawić wystarczy w dokerze odpalić i sprawdzić czy ci pasuje.
Nie będę ukrywać, że ustawianie tego, przynajmniej kiedyś, nie było najmilszym zajęciem, ale zwrotka jest nieporównywalna. No i w cenie masz logi, tracę, metryki.

0

Potwierdzam, że dodanie EnableBuffering() oraz context.Request.Body.Position = 0 ustabilizowało całą sytuację.

Na tę chwilę zostawiam mój middleware i zobaczymy jak się sprawy potoczą dalej. Kwestia @Dregorio z openTelemetry jest otwarta. Na pierwszą wersję projekt nie będzie miał za dużo userów, więc mogłoby to być lekkie przegięcie dla takiego projektu. Z czasem tych userów ma być więcej i mają też robić pewne operacje na telefonie, więc wtedy wdroże bardziej "wścibskie" rozwiązanie 👌

0

Co do Body
No body leci po strumieniu więc raz odczytany jest już nie do odczytu, do czasu przewiniecia.
Logowanie.
Są wygodne narzędzia z gotowymi db. Splunk, Newrelic. Nie wiem jak z licencjami.
Ewentualnie za darmo laduj do pliku Log4net a później batchowo parsuj pliki do DB.

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