Thread was being aborted na hostingu

0

Witam. Mam pytanko odnośnie błędu podane w tytule. W aplikacji mam metode ABC, która jest uruchamiana z metody Application_Start, natomiast w metodzie ABC mam stworzony wątek aby obsłużyć WebBrowser. Odpalając to lokalnie nie ma żadnych problemów ale gdy wrzucam to na hosting i odpalam to właśnie występuje błąd Thraed was being aborted i stacktrace jest do metody, w której jest tworzony wątek z WebBrowserem.

System.Threading.Thread thread = new System.Threading.Thread(delegate()
                        {
                            using (System.Windows.Forms.WebBrowser browser = new System.Windows.Forms.WebBrowser())
                            {
                                foreach (Cookie cookie in cookieCollection)
                                {
                                    InternetSetCookie(uriString, cookie.Name, cookie.Value);
                                }
 
                                browser.Navigate(uriString);
 
                                while (browser.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
                                {
                                    System.Windows.Forms.Application.DoEvents();
                                }
 
                                AJSCode = browser.Document.Body.InnerHtml;
                            }
                        });
 
                        thread.SetApartmentState(System.Threading.ApartmentState.STA);
                        thread.Start();
                        thread.Join();

Czy to może mieć jakiś związek z hostingiem? Nie wiem naprawdę jak się zabrać za ten problem.

Z góry dziękuje!

1

To ma związek z próbami używania kontrolek desktopowych w aplikacji webowej. To nie ma sensu z funkcjonalnego, wykonawczego ani nawet higienicznego punktu widzenia. Zrób to dobrze zamiast kombinować jak kobyła pod górę.

0

Potrzebuje użyć WebBrowsera, gdyż aplikacja wysyła requesty przy pomocy HttpWebRequest ale nie może wykonać Javascriptu na pytanym Url'u dlatego potrzebowałem przeglądarki do wykonania JS. W jaki inny sposób mogę to zrobić?

0

Ale co ten JS robi? Jaki jest cel?

0

Ten JS odpowiada za wyświetlanie głównie potrzebnych elementów na stronie. Przy requescie z HttpWebRequest dostaję tylko html strony a dane, które chcę wydobyć po prostu nie istniejąc bo JS nie został wykonany. Przy użyciu WebBrowsera wszystko działa pięknie, tak też wyczytałem na googlach, że jeżeli chce się wykonać JS to niezbędna będzie przeglądarka. Masz może pomysł w jaki inny sposób można to rozwiązać? Będę bardzo wdzięczny

0

Czy Ty chcesz jakąś inną stronę wyświetlić wewnątrz swojej strony?

0

Chce tylko pobrać informacje z tej strony i wyświetlić je na swojej.

0

Informacje na tamtej stronie muszą być zaczytane z jakiegoś adresu. Dowiedz się z jakiego, wywołaj go, a potem odczytaj, sparsuj i wyświetl dane u siebie.

0

Pierwsze pytanie jeśli chodzi o twojego WebBrowsera i genialny sposób do konwersji JavaScript. Prosty sposób na sprawdzenie oraz udowodnienie iż wbudowany WebBroser nic Ci nie da.

Stwórz sobie kontrolkę która zrobi tobie wizualizację podglądu strony i do tego zrób prostego naviagta na stronę z której chcesz pobrać elementy. Zobaczysz Co Ci w pierwszej kolejności wyskoczy. Bark obsługi JS. Więc generalnie nic Ci to nie da.

Albo podepniesz sobie obsługę JS i wtedy może na elementy się stworzą i załomocą IHTTPElements z driver.Document uda Ci się wyciągnąć element oraz jego wartości.

Albo podepnij sobie inny silniczek który Ciebie wyręczy z podpinania Js i jeje całej obsługi. Do wyboru masz te które testowałem.

GeckoFX - działa na zasadzie WebBrowsera tylko że jest bardziej efektywny.

SileniumHQ - odpalasz przeglądarkę nad którą masz pełną kontrolę i też możesz sobie pobrać dane elementów.

Na obu możesz manipulować elementami za pomoca ID czy Xpatch jak chcesz się odwołać do bardziej złożonych konstrukcji.
Lecz jak chcesz podmieniać wartości innego typu niż value czyli input. np target title itp. To łatwiej na GeckoFX się to obsługuje natomiast silenium takiej możliwości nie posiada i bardziej musisz na JScripcie to robić - tutaj polecem wstrzykiwanie kodu JQuery który bardzo dobrze się sprawdza i jest łatwy w obsłudze. Możliwość znajdowania elementów jak w przypadku Xpatcha i szybkiej podmiany. Jednak jest problem musisz zadbać o to żeby strona obsługiwała JQuery a jak nie to wstrzyknąć go ;) co dla mnie już nie było łatwym zdaniem ^^

0

Tylko po co tak kombinować, zamiast zrobić coś prosto i dobrze? - somekind.

Kombinowanie czy nie kombinowanie. Zmiana podejścia do zaganianie nie raz może wiązać się z większymi przeróbkami. Ty podałeś inny sposób, a ja też pod jego podejście z jakiego wcześniej bazował.

A tak nawiasem mówiąc. Jesteś wstanie somekind pobrać dane np jakieś wskaźniki bazujące na obliczeniach które strona pobiera z jakieś statystyk. I 2 sprawa czy jesteś wstanie pobrać dane które są wyświetlane z strony np tylko i wyłącznie po zalogowaniu ?

Oraz po co coś pobierać i prasować jak można bardzo prosto pobrać jakiś element.

IWebDriveElement  element = driver.FindElement(By.ID("ID itemu"))
string downloadValue = element.GetAtribute("value"); // za value możesz podać jaki chcesz atrybut

Przykład kodu dla silenium. Bazę wyszukiwania i pobierania jest o wiele bogatsza.

I teraz nie musi się kłopotać z prasowaniem strony i żmudnym wyciąganiu danych.

1

@komur.l, wbudowałeś kiedyś Selenium wewnątrz aplikacji webowej? Pokażesz przykład działającej aplikacji?

Wysyłanie żądań pod dany adres i odbieranie wyników, jest w .NET bardzo proste, są do tego gotowe klasy. Logowanie na stronie to też nie są żadne czary, to zwykłe żądanie i odpowiedź z jakimś tokenem autoryzacyjnym. Natomiast używanie w aplikacji webowej dektopowych kontrolek albo drivera do testów automatycznych wydaje się trudniejsze, a na pewno jest użyciem nieodpowiedniego narzędzia do celu.

0

Selenium do aplikacji webowej nie ma sensu wbudowywać a nawet nie wiem czy się da pomijając fakt iż trzeba by było ściągać odpowiednie drivery do przeglądarek, pomijając firefoxa. Dla tego też podałem GeckoFX który jest już lepszy od WebBrowsera a podobnie działa co Selenium zresztą składnia zbliżona do wykonywania operacji na elementach jak w js.

-Nawiązując do tego dla czego warto się też tym posłużyć. W niektórych przypadkach.
Jeśli chodzi o teokeny autoryzacyjne owszem tak. Ale zrobienie pełnej symulacji pracy użytkownika żeby nie zostało wykryte to już nie wiem czy będzie takie proste. Obsługę całego Postdaty np parametrów nawet w jakim punkcie subminta kliknęła myszka. I zastanawianiu się gdzie są weryfikowane boty. To już inna bajka. A to już rozwiązują oba silniki które podałem.

A tak wracając do początku naszej rozmowy i twojego pytania po co tak kombinować. To odpowiedziałem, że nie zawsze już pod koniec pisania projektu takie zmiany wychodzą na dobre.

A to jaką drogę sobie kolega obierze to już jego sprawa. Ale zawsze warto mieć wybór jeśli chodzi o możliwość wybrania rozwiązania. A czasem może i łatwiej zrobić twoim sposobem. Jednak jak jakieś dane które są wyświetlane generuje skrypt. To już nauczyłem się na przykładach, że te dane nie są brane żywcem tylko wyświetlane na bazie analizy paru zmiennych. Co przeanalizowanie tego skąd się to bierze i zrobienie własnej symulacji skryptu o ile do wartości uda Ci się odwołać w jakiś sposób. To w przypadku jak pobierasz z 1000 zmiennych to szczerze nie wiem czy bym się tak chciał bawić.

Szkoda że nie ma linku do strony z której dane trzeba pobrać oraz informacji jakie, bo wtedy by łatwiej myślę dało by się rozmawiać na ten temat jaka metodę wykorzystać. Na razie sobie gdybamy.

0

Dzięki wielkie chłopaki za konwersacje.

Odnośnie pytania somekind - tak, normalnie gdy pobieram HTML to widzę link do tego skryptu JS ale gdy puszczę do niego requesta to co uzyskam? Tak czy siak jeżeli dobrze myślę to spróbuję tak zrobić, podpowiedz tylko czy o to chodzi :).

Komur, spróbuję twoich sposobów jak ten z requestem do javascriptu nie pójdzie :P. Aplikacja, w której to robię to ASP.NET MVC, postawiona strona, która łączy się z inną stroną, loguje się, pobiera dane, wykonuje różne rzeczy, tworzy na ten temat statystyki, krótko mówiąc automatyzuje proces.

0

Nie wiem i ty też somekind nie wiesz, więc też nie możesz wychodzić z założenia że twój pomysł jest w 100% uniwersalny. Też nie uważam że moje podejście jest dobre. Tak jak sam zauważyłeś wrzucanie kontrolek desktopowych do aplikacji webowej. Ale od czasu jak na WPF ja przeszedłem to też niejednokrotnie jestem zmuszony do użycia kontrolek z WinForma i zrobienie obejścia żeby to działało.

Prosty przykład kontrolka WebBrowser na wpf i na win forma mają całkowicie inne metody i z wpf funkcjonalność spada na maxa. Żeby podłączyć GeckoFX na wpf też się nieźle trzeba nakombinować żeby krytyki nie wybijały. Przez co robię niezłe hydry byle bym miał funkcjonalność na której mi zależy.

Ale nie o tym rozmowa, zwróciłem koledze uwagę tylko pod kątem tego że on chciał wykorzystać WebBrowsera by móc zainicjować skrypt JS. A WebBrowser się na tym masakry stycznie sypie. I jak musi z czegoś takiego korzystać to polecam GeckoFX lub selenium ("z rozmachu to tutaj wpisałem, ale dla desktopowych już bym polecał ale też zależy czy chcemy mieć otwierane okna w tle")

0

Podobnymi sprawami my się zajmujemy. Tylko, że u nas nie może wyjść nigdzie iż robi to jakiś bot. W 100% symulujemy zwykłego użytkownika. Aż do tego względu, że lecimy na modemach 3G i program sam resetuje połączenie i łączy się ponownie z modemem w celu uzyskania nowego IP. Symulujemy Wszystkie przeglądarki w Selenium już user agenta nie trzeba.

Tak btw do user agenta WebBrowser jak sobie ktoś zmieni na google to prosta strona pokaże wpisanego user agenta, a pewna która sprawdza obsługę JS Od razu informuje że na IE siedzimy. GeckoFX przy podmianie user agenta jest też do nie wykrycia. Selenium sam już załatwia sprawę po zarządzamy przeglądarką.

To u nas wygląda to mniej więcej tak API - zarządza cała bazą danych co tam potrzebujesz. Aplikacja komunikuje się z API i wykonuje polecenia pobieranie danych czy tam też wprowadzanie i to nam siedzi na aplikacji desktopowej. A jakby to wyglądało z strony Serwisu hmmm nie wiem, jedynie jak to widzę po stronie witryn na których pracujemy to jest PostData, jeden mały bład nowy wyjątek i jest lipa np zła suma kontrolna wartości generowana na niektórych formularzach.

Powiem wprost, ja jestem leniem ^^ i nie chciało by mi się każdej strony aż tak analizować w moim przypadku. Dla tego robię to inną drogą. Jeżeli kolega ma zamiar robić bota niewykrywalnego to też powinien iść pod kierunkiem automation webbrowser a nie requestami.

0

sorki uesragenta nie na google tylko na chrome czy innego ;)

0

@somekind
Jeżeli chodzi o odpytanie skryptu requestem to przy tej próbie mam komunikat "Nawigacja do strony sieci Web została anulowana". Ten kod miał za zadanie stworzyć HTML, co prawda stworzył ale wszędzie są błędy.

0
Dalmatynczyk napisał(a):

Odnośnie pytania somekind - tak, normalnie gdy pobieram HTML to widzę link do tego skryptu JS ale gdy puszczę do niego requesta to co uzyskam? Tak czy siak jeżeli dobrze myślę to spróbuję tak zrobić, podpowiedz tylko czy o to chodzi :).

Ten skrypt zapewne wysyła jakieś dane pod jakiś adres, i odbiera odpowiedź. Dowiedz się, jaki to adres, i pod ten adres odwołuj się ze swojej aplikacji.

komur.l napisał(a):

Nie wiem i ty też somekind nie wiesz, więc też nie możesz wychodzić z założenia że twój pomysł jest w 100% uniwersalny.

Nie chodzi mi o uniwersalność, nigdzie tak nie twierdzę. Moje rozwiązanie jest proste. Z doświadczenia wiem, że proste rzeczy działają lepiej i dłużej niż skomplikowane.

Ale od czasu jak na WPF ja przeszedłem to też niejednokrotnie jestem zmuszony do użycia kontrolek z WinForma i zrobienie obejścia żeby to działało.

Tylko to jest zupełnie coś innego. Osadzając kontrolki WF w WPF ciągle działasz w aplikacji desktopowej. Wszystko, co potrzebujesz to jakiś wrapper, który będzie rysował jeden rodzaj okienek w innych i umożliwi przechwycenie ich zdarzeń. A, że to wszystko i tak sprowadza się do WinAPI, to nie ma z tym problemu.
Podobnie stosuje się osadzanie kontrolek ASP.NET WebForms w aplikacjach ASP.NET MVC. Tylko one wszystkie i tak renderują się do HTMLa, i tak używają JS, HTTP i reszty stosu webowego. Trzeba trochę pohackować, ale wciąż zostaje się w jednym świecie.
A osadzanie kontrolki destkopowej w aplikacji webowej, to tworzenie mutanta z dwóch różnych światów, który nie ma prawa działać.

Nie mówię, że Twój pomysł jest zły, na pewno jest lepszy niż WebBrowser, ale cały czas uważam, że da się to zrobić prościej.

0

@somekind

Ten skrypcik pobiera jakieś parametry z przeglądarki po czym mieli wszystkie funkcje w sobie budując html i dodając tego zbudowanego html pod istniejącego diva. Z tego co widzę żadnych informacji nigdzie nie wysyła tylko mieli to w sobie i zwraca od razu do diva.

0

ref

0

Wszystko, co można było powiedzieć nie znając kodu skryptu ani strony, już zostało powiedziane.

0

Skrypt wygląda w ten sposób http://pastebin.com/3L1H5Wh7
Na stronie występuje w ten sposób <script type="text/javascript" src="8634/js/tooltips2.js"></script> (tooltips2.js to jest plik podany w pastebinie)

Przeglądarką wszystko działa pięknie ale bez niej to nie działa :D. Możecie mi powiedzieć w ogóle dlaczego ten błąd występuje "Thread was being aborted"? Lub sposobem @ ale nie bardzo wiem, jak to ma wyglądać bo przy zwykłych requestach nawet do tego pliku nic się nie dzieje.

Z góry bardzo dziękuje

0

ref

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