[C#] Method not found, maar lijkt wel toegevoegd?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • maarud
  • Registratie: Mei 2005
  • Laatst online: 23:20
Ik zit me te verdiepen in het maken van een klein, simpel Windows Mobile 6.5 programmaatje voor de WEH6.5 scanners die we gebruiken.

Het uiteindelijke doel is een app maken van een bestaande website. Een soort schil er om heen als het ware. Het navigeren e.d. binnen een app gaat namelijk makkelijker (en véél sneller) op het kleine apparaatje dan via de webversie.

Versie 0.1 werkt. Ik ben als volgt begonnen (als leek):
- Visual Studio 2008 Professional geïnstalleerd
- Windows Mobile 6.5 DTK en SDK geinstalleerd
- Nieuw project gemaakt voor Smart Device (target .NET 3.5)
- App met textboxje (waar de scanner in scant) die na het scannen een GET request doet naar een webadres via HttpWebRequest en een statuscode terugkrijgt (200 = artikel bestaat, 201 (kon niets anders bedenken) artikel bestaat niet).

Dit werkt. Tijd voor een stapje hoger.

Versie 0.2
Het uitlezen van een bestaande website (met vrij simpele HTML en tabellen) en daarmee communiceren (via GET requests). Daarvoor begrijp ik dat ik HTML Agility Pack moet gebruiken. En dan begint het gedoe.

HAP heeft alleen versies voor .NET 2.0 en .NET4.0. Ik heb versie 2.0 gepakt, maar dan krijg ik de foutmelding dat hij System.XML wil hebben van versie 2.0.0.0 (en ik gebruik 3.5.0.0).

Na wat stoeien en het maken van een nieuw project met target 2.0 heb ik het voor elkaar dat het project in ieder geval compiled. Alleen bij het debuggen krijg ik de melding dat System.IO.File.GetLastWriteTime niet gevonden kan worden. Achteraf blijkt dat VS2008 mscorlib.dll uit de Compact Framework versie (die praktisch de helft mist) gebruikt. Ik heb die reference verwijderd en de reference naar de gewone .NET 2.0 mscorlib.dll toegevoegd, waar die methode wel in zit.

Maar HAP blijft zeuren dat de methode niet gevonden kan worden. Nu weet ik het dus even niet meer...waarschijnlijk is het heel simpel en zie ik iets over het hoofd maar ik moet alles uitvinden met trial and error en ik kom er na een hele ochtends Googlen niet meer uit 8)7.

Wie kan me het goede pad op leiden?

Acties:
  • 0 Henk 'm!

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 21:40

tha_crazy

Mafketel

Voor het uitlezen van een website heb je geen HTML Agility Pack nodig, je kan dit ook middels een WebRequest doen MSDN

Waarschijnlijk wel wat meer werk (ben totaal niet bekend met HAP), maar aangezien het om een simpele HTML pagina gaat moet dat wel te doen zijn.

Nu ben ik verder niet bekend met Windows Mobile development, maar neem aan dat deze classes wel beschikbaar zijn.

[ Voor 3% gewijzigd door tha_crazy op 18-10-2016 11:53 ]


Acties:
  • 0 Henk 'm!

  • maarud
  • Registratie: Mei 2005
  • Laatst online: 23:20
Tja, ik kom er op omdat de meesten dat adviseren:
http://stackoverflow.com/...05379/parsing-html-string

Nu vind ik wel deze website:
http://www.codeproject.co...ta-Through-POST-in-Csharp

Die zegt dat het ook via HtmlDocument kan, maar als ik die tutorial volg dan krijg ik errors dat voor HtmlDocument geen constructors gedefineerd zijn. Als ik daar dan weer op google vind ik
http://stackoverflow.com/...46/string-to-htmldocument
en dan lijkt het gewoon een soort van mini-browser te worden (= wellicht traag).

Pff, lastig als je alles moet uitvinden via Google ;)

Ik moet wel zeggen, achter de webpagina zit een ASP.NET programma (in IIS). Misschien kan ik daar ook direct op inhaken?

Acties:
  • 0 Henk 'm!

  • maarud
  • Registratie: Mei 2005
  • Laatst online: 23:20
Volgens mij gaat het niet lukken in Compact Framework 3.5. Hier missen teveel functies om webpagina's te kunnen parsen, heb ik het idee...

Acties:
  • +1 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
HTTP 201 (kon niets anders bedenken) ?! Ik snap dat je als programmeur een beginner bent, maar dit soort codes verzin je niet. Sterker nog, HTTP 404 is ook voor genoeg niet-programmeurs bekend.

Sowieso lijk je nog moeite te hebben met basisbegrippen. HTTP is een netwerk protocol, HTML een webpagina protocol. Aangezien de data van web client (scanner) naar server gaat, is het logischerwijs geen GET maar een POST. Je gebruikt nu een GET om een tekstveld te krijgen wat je vervolgens POST.
Dat is nogal onlogisch en veroorzaakt nodeloos werk.

En nee, je kunt niet zomaar random functies uit de "grote" .Net gebruiken als je wil deployen op .Net Compact Framework. Maar met een goed design was dat ook geen probleem geweest. "mini browser = wellicht traag". Nodeloze netwerk communicatie, dat is traag.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • maarud
  • Registratie: Mei 2005
  • Laatst online: 23:20
Eeuhm, even wat verduidelijken geloof ik ;) Een code in de 4xx serie geeft een Exception, en daar had ik andere code in zitten, dus om toch even een verschil te maken tussen artikel niet gevonden, maar website bestaat wel, heb ik even snel 201 misbruikt als test. In een productie-app is dat not done natuurlijk.

Ik weet alleen niet waar je vandaan haalt dat ik het verschil niet weet tussen HTTP en HTML, maar afijn, ook hier even verduidelijken ;)

De data die naar de website gaat is toch echt een GET, want de contents van de textbox wordt meegestuurd in de URL (?order =12345). De website returned dan vervolgens informatie over de order.

Helaas kom ik er pas na twee dagen stoeien achter dat ik teveel .NET functies wil gebruiken op een device wat alleen Compact Framework heeft, maar goed dat hoort bij het leerproces. Ik heb alleen nu even geen idee meer hoe ik een website kan parsen (tabel uitlezen bijvoorbeeld) op een CF 3.5 device.

Acties:
  • 0 Henk 'm!

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 21:40

tha_crazy

Mafketel

Zoals al eerder gemeld, en ook in 1 van de links hierboven kan je dat prima met WebRequest doen.
Even een smerig voorbeeld wat ik ooit eens had geschreven toen ik met spoed een landconversietabel nodig had als class in C#

Zoals je kan zien kan je hier een webrequest maken naar elke willekeurige pagina zolang die maar te bereiken is en gewoon de HTML er uit lezen.
Middels dan wat simpel string werk kan je dan de waardes eruit halen die je nodig hebt (let op, hieronder is misschien niet het beste voorbeeld)
Ja je zal wat moeten substringen (weet niet of LINQ een onderdeel is van CF3.5?) maar hier zal je aardig mee uit de voeten moeten kunnen.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
        private void Crawl2()
        {
            WebRequest request = WebRequest.Create("https://nl.wikipedia.org/wiki/ISO_3166-1");

            StreamReader streamReader = new StreamReader(request.GetResponse().GetResponseStream());

            List<string> site = new List<string>();

            string strLine;

            while ((strLine = streamReader.ReadLine()) != null)
            {
                if (strLine.Length > 0) site.Add(strLine); //str.Append(strLine);
            }
            streamReader.Close();

            bool getCode = false;
            string country = "";
            string countryCode = "";

            foreach (string line in site)
            {
                //landcode ophalen
                if (getCode == true)
                {
                    string currentLine = line.Remove(0, line.IndexOf(">") + 1);
                    countryCode = currentLine.Remove(currentLine.IndexOf("<"));
                    getCode = false;
                }
                //land ophalen
                if (line.Contains("Vlag van "))
                {
                    string currentLine = line.Substring(line.LastIndexOf("title"));
                    currentLine = currentLine.Remove(0, (currentLine.IndexOf(">") + 1));
                    country = currentLine.Remove(currentLine.IndexOf("<"));

                    //bool zetten, volgende regel zit de country code
                    getCode = true;
                }

                if (!string.IsNullOrEmpty(country))
                {
                    textBox1.Text += "\"" + country + "\"," + Environment.NewLine;
                    country = "";
                }

                if (!string.IsNullOrEmpty(countryCode))
                {
                    textBox2.Text += "\"" + countryCode + "\"," + Environment.NewLine;
                    countryCode = "";
                }
            }
        }

Acties:
  • 0 Henk 'm!

  • Robicide
  • Registratie: Maart 2016
  • Laatst online: 22:02
maarud schreef op dinsdag 18 oktober 2016 @ 14:38:
Eeuhm, even wat verduidelijken geloof ik ;) Een code in de 4xx serie geeft een Exception, en daar had ik andere code in zitten, dus om toch even een verschil te maken tussen artikel niet gevonden, maar website bestaat wel, heb ik even snel 201 misbruikt als test. In een productie-app is dat not done natuurlijk.
201 = "Created". Dan kun je, als je echt geen 4xx code terug wil geven, beter nog een 204 teruggeven (= "No Content").

Evengoed is dit gewoon exact waar de 404 voor is. 404 is niet "Site bestaat niet" maar "Resource not found". Dat kan een pagina zijn, of een folder, of een artikel, of willekeurig wat voor content dan ook. Als je al andere code in je 404 exception handling hebt zitten, vang je daar waarschijnlijk ook de verkeerde situatie af ;)

Acties:
  • 0 Henk 'm!

  • maarud
  • Registratie: Mei 2005
  • Laatst online: 23:20
Klopt, ik weet hoe dat werkt... maar toch bedankt voor de uitleg ;) Het is gejatte code van Stackoverflow waarin ik alleen de URL heb veranderd om te kijken of ik een Hello World dingetje kon maken. En dat kon ik :P

Mijn vraag is echter hoe en óf ik HTML kon laten verwerken door CF3.5. Het lijkt dat de enige mogelijkheid is, iets nasty zoals tha_crazy voorstelt, namelijk de HTML ophalen en die-hard in de code zoeken naar de waardes die je wil.

XMLReader werkt helaas niet op de webpagina dus ik begin te denken dat handmatig de HTML doorspitten vrijwel de enige oplossing is omdat ik weinig invloed heb op de geserveerde pagina tenzij ik de hele webpagina omzeil en iets doe met ASP.NET welke de pagina genereerd.

[ Voor 11% gewijzigd door maarud op 19-10-2016 10:34 ]


Acties:
  • 0 Henk 'm!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 10-10 16:36

mulder

ik spuug op het trottoir

Kun je niet een web service bouwen die dit werk voor je doet en dit dan aanlevert aan je mobile app?

oogjes open, snaveltjes dicht


Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 09-10 15:53
mulder schreef op woensdag 19 oktober 2016 @ 11:42:
Kun je niet een web service bouwen die dit werk voor je doet en dit dan aanlevert aan je mobile app?
Inderdaad, dit lijkt me veel makkelijker (en waarschijnlijk ook voor de gebruiker sneller) om een SOAP service te maken die dit voor je doet. Die service kan je dan makkelijk toevoegen aan jet CF app en gebruiken ipv te proberen dit te parsen op de pda.

Als je bij de code van de huidige webpagina kan komen, zou je dat ook dan kunnen gebruiken om de service mee te maken ipv html parsen.

[ Voor 12% gewijzigd door urk_forever op 19-10-2016 14:36 ]

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • maarud
  • Registratie: Mei 2005
  • Laatst online: 23:20
Ik heb nu een 'read-only' app gemaakt met inderdaad de webserver die het groffe werk doet.

Nu draait op de webserver een PHP-script die een XML bouwt met gegevens van de SQL server. De XML kan dan wel weer makkelijk worden uitgelezen door de PDA.

Dat draait nu wel lekker en goed (met juist gebruikte en afgevangen HTTP-codes :+ ).

Maar hoe moet ik zien wat jullie bedoelen?
De huidige situatie is een .NET Business Connector die in de ERP-software zit en een .aspx pagina bouwt (de webpagina die ik uit wil lezen).

Maak ik dan een service die aan de Business Connector hangt (lastig?) of een 'PHP-vertaalmachine' die vertaalt tussen de webpagina (aspx) en mijn app (xml)?

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
maarud schreef op dinsdag 18 oktober 2016 @ 14:38:
Ik weet alleen niet waar je vandaan haalt dat ik het verschil niet weet tussen HTTP en HTML, maar afijn, ook hier even verduidelijken ;)

De data die naar de website gaat is toch echt een GET, want de contents van de textbox wordt meegestuurd in de URL (?order =12345). De website returned dan vervolgens informatie over de order.
Ja, precies wat ik bedoel met het verschil niet kennen. Je wil helemaal geen HTML gebruiken hier, en dus ook geen textbox. Jouw probleem is dat jij de HTTP POST vanuit een HTML textbox wil laten doen, waarvoor je een heel HTML document moet optuigen, en dat HTML document door een webbrowser moet laten verwerken.

Pak eens Fiddler zodat je mee kunt kijken met wat er gebeurt: GET op HTML op te halen, textbox invullen, submitten, en dan volgt die HTTP POST.

Wat jij gewoon moet doen is direct die laatste HTTP POST, zonder al die stappen vooraf.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • maarud
  • Registratie: Mei 2005
  • Laatst online: 23:20
Nee, de Textbox is het element in mijn formulier. In het c# formulier typ je iets in de textbox, drukt op de button, vervolgens vraag ik een url op ("order.php?order=" + textbox1.Text) en de xml die ik terug krijg verwerk ik weer.

Het is trouwens nu opgelost. Ik kon de HTML toch verwerken met XML Reader en SelectSingleNode om te extraheren wat ik wil uit de pagina :)
Pagina: 1