Avatar billede davidfossil Nybegynder
24. november 2005 - 22:53 Der er 4 kommentarer og
1 løsning

Træning i brug af System.Uri

/*
Sidder og roder - mest for sjov - med en meget simpel webspider, men er gået lidt i stå over hvordan man bør arbejde med internet adresser i .NET frameworket. I får lige et eksempel, og så håber jeg at der er nogen derude der har fuldstændig styr på Uri klassen (som jeg tror jeg skal bruge)...
*/

// Her har vi en Uri med adressen til et website:
Uri rootUri = new Url("http://exp.dk");

// Efter at have lavet et fiktivt request står jeg med fem links:
string[] links = { "/about.html", "http://exp.dk/foo.php", "bar.php", "http://dr.dk/artikler/12245.html", "java script:alert('foobar');" };


Nu har jeg altså 5 forskellige links at tage stilling til. I mit tilfælde ønsker jeg kun at følge de tre første (jeg vil ikke forlade sitet, og ikke forsøge at afvikle scripts).

Spørgsmålet er om/hvordan jeg kan bruge min eksisterende variable rootUri, til at bestemme hvilke af adresserne jeg skal følge. Og ligeledes om jeg kan "joine" denne rootUri med en af mine links-strenge (fx "/about.html" og få "http://exp.dk/about.html") på en fornuftig måde.

Det jeg ønsker at undgå er 5 siders kode med if, indexof, startswith etc.

Målet er altså at finde den korteste kode der kan skabe Uri objekter for de tre første adresser, og kassere de to sidste. Håber der er nogen derude der har en idé og synes det vil være sjovt at prøve :o) Jeg har sat rigeligt points af så der kan deles ud til alle gode idéer.
Avatar billede arne_v Ekspert
25. november 2005 - 00:48 #1
ikke helt nemt

lidt eksperimenteret endte op med følgende:

using System;

namespace E
{
    class MainClass
    {
        public static bool Test(Uri baseUri, string link)
        {
            try
            {
                Uri testUri = new Uri(link);
                return (baseUri.Scheme == testUri.Scheme) &&
                      (baseUri.Host == testUri.Host);
            }
            catch (UriFormatException ex)
            {
                try
                {
                    Uri testUri = new Uri(baseUri, link);
                    return true;
                }
                catch (UriFormatException ex2)
                {
                    return false;
                }
            }
        }
        public static void Main(string[] args)
        {
            Uri rootUri = new Uri("http://exp.dk");
            string[] links = { "/about.html", "http://exp.dk/foo.php", "bar.php", "http://dr.dk/artikler/12245.html", "java script:alert('foobar');" };
            foreach(String link in links)
            {
                Console.WriteLine(link + " " + Test(rootUri, link));
            }
        }
    }
}
Avatar billede davidfossil Nybegynder
25. november 2005 - 14:46 #2
Du vinder igen, arne. Det var lige præcis sådan noget jeg søgte :)

Jeg har lige et bonusspørgsmål (man kan jo altid prøve...):
Er det muligt at læse i http headers i et HttpWebResponse (eller lign), før selve indholdet er svaret downloades. Ønsket er at kunne tjekke om content type er text/html, så man sparer sin båndbredde for pdf-filer, zip-filer, billeder og lign.
Avatar billede arne_v Ekspert
25. november 2005 - 14:48 #3
Du kan godt teste header inden hele filen er hentet. Lige ud af
landevejen.
Avatar billede davidfossil Nybegynder
25. november 2005 - 15:07 #4
Hehe, jeg skal altså bare spørge til response.ContentType == "text/html" inden jeg begynder at læse fra response streamen? :)

Smid er svar!
Avatar billede arne_v Ekspert
25. november 2005 - 15:09 #5
jep

vær opmærksom på at den nok henter noget af selve content når du kalder GetResponse
men med en stor fil er det kun det første

og svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester