Avatar billede Slettet bruger
20. marts 2009 - 00:23 Der er 17 kommentarer og
1 løsning

HTTP: Håndtering af adgangskodebokse

Hej eksperter,

Jeg roder for tiden med diverse bots og automatiserede systemer til HTTP-kommunikation og websidehåndtering, og der er noget, jeg ikke helt kan greje. Prøv at se her (eksempel):
http://skolenet.ats.dk/HTX-Viby/
For at komme til underpunkterne, skal brugeren indtaste brugernavn og password. Mit spørgsmål er, hvordan dette håndteres, når man anvender .NET's indbyggede funktioner til HTTP-baseret kommunikation?

Herunder er en lille test af den fremgangsmåde, jeg som udgangspunkt bruger - hvis det er nogen hjælp:

// using DEFAULTS;

using System.IO;
using System.Net;

namespace LoadHTTP
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                try
                {
                    Console.Write("Please enter the target URL (http:// excluded): ");
                    string url = "http://" + Console.ReadLine();
                    Console.Write("Please enter the desired file extension: ");
                    string extension = Console.ReadLine();
                    WebRequest request = WebRequest.Create(url);
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    Stream stream = response.GetResponseStream();
                    StreamReader reader = new StreamReader(stream);
                    string address = response.ResponseUri.AbsoluteUri;
                    string target = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\LoadHTTP." + extension;
                    TextWriter writer = new StreamWriter(target);
                    writer.Write(reader.ReadToEnd());
                    writer.Close();
                    reader.Close();
                    stream.Close();
                    response.Close();
                    Console.WriteLine("\nHTTP response from " + address + " saved to " + target + ".");
                }
                catch (Exception e)
                {
                    Console.WriteLine("\n" + e.ToString());
                }
                Console.WriteLine("\nRestarting...\n");
            }
        }
    }
}
Avatar billede arne_v Ekspert
20. marts 2009 - 01:06 #1
request.Credentials = new NetworkCredential("brugernavn", "password");;
Avatar billede Slettet bruger
20. marts 2009 - 01:33 #2
Tak :) Er det muligt at tjekke, om en URL kræver credentials?
Avatar billede arne_v Ekspert
20. marts 2009 - 01:55 #3
Kun ved at kalde den og se om du får en status kode 401 tilbage.
Avatar billede Slettet bruger
20. marts 2009 - 11:39 #4
Godt så. Lige et sidespørgsmål: Er det muligt at få returneret en statuskode som int (eller anden taltype)? Jeg har rodet lidt med hele header-blokken, men det er ikke just effektivt.
Avatar billede Syska Mester
20. marts 2009 - 11:48 #5
HttpWebResponnse har vist en Enum som hedder HttpStatusCode eller deromrking ... og den kan du jo cast til en Int.

http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.statuscode(VS.80).aspx

// ouT
Avatar billede arne_v Ekspert
20. marts 2009 - 11:49 #6
response.StatusCode

men pas på - jeg tror at den smider en exception ved en fejl kode
Avatar billede arne_v Ekspert
20. marts 2009 - 11:49 #7
Var det ikke bare nemmere altid at sende auth info med ?
Avatar billede Syska Mester
20. marts 2009 - 11:53 #8
En exception ved "FileNotFound" ? eller hvad mener du Arne ?

Jeg bruger selv overstående ... da jeg til tider at mærkelige grunde skal prøve at hente nogen filer igen da jeg får FileNotFound.

// ouT
Avatar billede Slettet bruger
20. marts 2009 - 11:59 #9
#7
Nej, for hvad hvis mine bots når til en side, der kræver et andet sæt logininformation? Så skal den kunne håndtere skiftet og lede i en database, tekstfil eller lignende.
Avatar billede Slettet bruger
20. marts 2009 - 19:02 #10
Jeg spørger lige en gang mere :)
Er det muligt at få returneret en statuskode som int (eller anden taltype)? Jeg har rodet lidt med hele header-blokken, men det er ikke just effektivt.

Bare smid et svar samtidig, Arne.
Avatar billede arne_v Ekspert
20. marts 2009 - 19:08 #11
Virker svaret i #6 ikke ?
Avatar billede Slettet bruger
20. marts 2009 - 22:05 #12
Hov! Det så jeg slet ikke - beklager, jo, det virker nok så :)
Avatar billede Slettet bruger
21. marts 2009 - 00:19 #13
Bare smid et svar.

Og så lige er sidespørgsmål:
Hvordan håndteres URL'er lettest med C#? Hvis jeg f.eks. ønsker at følge den relative sti "cake/lol.html" eller "?cakish=true" fra "http://foo.bar.com/fubar/kage.html", skal jeg jo have fjernet "kage.html" fra den oprindelige sti og tilføjet de relative påbygninger - men er der ikke en færdig løsning til at kende relative stier fra absolutte og håndtere dem korrekt?
Avatar billede arne_v Ekspert
21. marts 2009 - 01:37 #14
Prøv:

using System;

namespace E
{
    public class Program
    {
        public static string UrlCombine(string baseurl, string relurl)
        {
            return (new Uri(new Uri(baseurl), relurl)).ToString();
        }
        public static void Main(string[] args)
        {
            string baseurl = "http://foo.bar.com/fubar/kage.html";
            string relurl = "cake/lol.html";
            Console.WriteLine(UrlCombine(baseurl, relurl));
            Console.ReadKey();
        }
    }
}
Avatar billede arne_v Ekspert
21. marts 2009 - 01:37 #15
Og et svar.
Avatar billede Slettet bruger
21. marts 2009 - 01:47 #16
Det er lige det, jeg skal bruge :) Tak.
Avatar billede arne_v Ekspert
22. marts 2009 - 00:46 #17
buzz>

Hvis filen ikke findes på web server smides der en exception.

Demo kode:

using System;
using System.IO;
using System.Net;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            HttpWebRequest req = null;
            HttpWebResponse resp = null;
            try
            {
                req = (HttpWebRequest)WebRequest.Create("http://localhost/notexist.txt");
                resp = (HttpWebResponse)req.GetResponse();
                Console.WriteLine("No exception and code = " + resp.StatusCode);
            }
            catch(WebException wex)
            {
                Console.WriteLine("Exception and code = " + ((HttpWebResponse)wex.Response).StatusCode);
            }
            Console.ReadKey();
        }
    }
}
Avatar billede Syska Mester
22. marts 2009 - 03:40 #18
ups, haha ja ...

Også der jeg udlæser min StatusCode. Det er vel også mest logisk den skal smide en, ellers ville der være en masse ting man var tvungen til at holde øje med gik godt.

// ouT
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