Avatar billede Slettet bruger
02. november 2007 - 11:06 Der er 19 kommentarer og
1 løsning

Async webrequest

Hej eksperten!

Jeg er løbet ind i et lille problem.

Jeg har brug for at kunne kalde en webside async fra en C# klasse. Udfordringen er, at jeg skal kalde en webside i et af vores gamle systemer (for at holde dette ajour), men jeg ønsker ikke at min C# kode skal "stå og vente" på at dette kald bliver færdigt (kan tage op til 30 sekunder). Er der nogen måde hvorpå jeg kan kalde denne side async, og derefter glemme alt om dette kald? Jeg har ikke brug for en return code eller noget - jeg skal bare kalde siden og derefter glemme det er sket.

Jeg har rodet lidt med System.Net.WebRequest - her kan man lave et async kald. Men godt nok er det async, men man skal stadig definere hvad der skal sker efter kaldet er complete.

Nogle der har en løsning?
Avatar billede jarret Nybegynder
02. november 2007 - 11:29 #1
hvad med at oprette en ny tråd?
Avatar billede jarret Nybegynder
02. november 2007 - 11:34 #2
Thread thread = new Thread(new ThreadStart(din_metode));
thread.Start();

- måske
Avatar billede sherlock Nybegynder
02. november 2007 - 12:30 #3
Jeg har ikke selv mulighed for at teste det, med en timeout på 1/1000 sekund bør kunne gøre det.

{Code errors likely present.}
void RequestUrl(string url)
{
    try
    {
        webResponse = null;
        HttpWebRequest  http = (HttpWebRequest) webRequest.Create(url);

        http.Timeout = 1;    // Vent kun 1/1000 sekund

        HttpWebResponse webResp = (HttpWebResponse) http.GetResponse();
    }
    catch {}
} // RequestUrl
Avatar billede Slettet bruger
02. november 2007 - 13:20 #4
try
{
  HttpWebRequest http = (HttpWebRequest)WebRequest.Create(url);
  http.Timeout = 1000; // Vent kun 1/1000 sekund
  HttpWebResponse webResp = (HttpWebResponse)http.GetResponse();
}
catch { }

ser ud til at virke - dog har jeg måtte sætte timeout op fra 1 til 1000 (dvs. 1 sek).
Avatar billede bvli Praktikant
02. november 2007 - 13:25 #5
Hva' er problemet i, at du skal definere hva' der skal ske når kaldet er complete?

Altså noget a'la:

[...]
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(someUrl);
req.BeginGetResponse(new AsyncCallback(callback), req);
[...]

private static void callback(IAsyncResult ar) {
try {
  HttpWebRequest req = (HttpWebRequest) ar.AsyncState;
  req.EndGetResponse(ar); //ignore result
} catch (Exception e) {
  //Log some error eller noget
}


/B
Avatar billede sherlock Nybegynder
02. november 2007 - 13:26 #6
Så skal du lave Threads for at undgå ventetid.
Avatar billede Slettet bruger
02. november 2007 - 13:34 #7
sherlock:
Jeg har prøvet med treads - det virker ikke helt som jeg ønsker.

Lige efter jeg har kaldt den siden til det gamle system async redirectes brugeren til en helt tredje side. Det dræber de tråde jeg har lavet!
Avatar billede Slettet bruger
02. november 2007 - 13:35 #8
bvli:
problemet er, at jeg ikke har tid til at vente på det - da jeg skal sende brugeren videre i vores system (dvs. redirecte til andre sider). hvis jeg venter på at mit async kald bliver færdig, så skal brugeren jo også vente - det er ikke lige det jeg ønsker.
Avatar billede bvli Praktikant
02. november 2007 - 13:45 #9
Men du skal da heller ikke vente på, at kaldet bliver færdigt når du kalder den asynkront?
Avatar billede sherlock Nybegynder
02. november 2007 - 13:51 #10
Hvad med at lave kaldet, asynkront, på den næste side?
Og nu vidste vi jo ikke at det var på en webside, så måske lidt JavaScript med XMLHTTPRequest kan klare sagen for dig?
Avatar billede Slettet bruger
02. november 2007 - 13:55 #11
Den venter vel til den er færdig, og derefter kaldes callback function!

At det er async behøver jo ikke betyde, at jeg bare kan "forlade" siden og gå til en anden.

Async i den kode du har skrevet betyder vel mere, at man kan have flere parallelle http request samtidig - og derved opstår begrebet async.... eller har jeg misforstået det?

Det jeg ønsker er en form for "fire and forget" funktionalitet - som lever sit helt eget liv.
Avatar billede Slettet bruger
02. november 2007 - 13:56 #12
sherlock:
Kan ikke lave det på næste side, da jeg ikke ved hvor længe brugere vil opholde sig på denne side. Det kan jo være alt fra 1 sek. til flere timer....

Jeg kan ikke se hvordan JavaScript med XMLHTTPRequest vil kunne hjælpe mig?
Avatar billede bvli Praktikant
02. november 2007 - 13:59 #13
Den afvikles i en separat tråd fra thread pool'en. Den tråd kalder callback'en når den er færdig. Callback'en er statisk, dvs. den behøver ikke din side instance (selvom det egentlig er underordnet). Prøv at implementere de få linier jeg gav dig, og se om ikke det lige er det du har brug for.

/B
Avatar billede Slettet bruger
02. november 2007 - 14:55 #14
bvli:
giver det et forsøg til :) har snart prøvet så meget forskelligt, så et mere struktureret forsøg er nok ikke af vejen...

vender tilbage med en lille update senere... :)
Avatar billede sherlock Nybegynder
02. november 2007 - 15:10 #15
Den side, du skal requeste. hvad gør den egentlig?
Eller: Hvad af det den gør, skal du have udført? Måske kan det gøres helt anderledes?
Avatar billede bvli Praktikant
02. november 2007 - 15:44 #16
Ok - nu kunne jeg ikke styre min nysgerrighed mere, og måtte prøve det selv. Jeg har lavet en form, indsat en knap og følgende kode.

Jeg har fint kontakt med google i min egen browser - længe før mit debugvindue skriver, at request'et er afsluttet.


private void Button1_Click(object sender, System.EventArgs e)
{
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://google.com");
    req.BeginGetResponse(new AsyncCallback(callback), req);
    Debug.WriteLine(string.Format("[{0}] Request started..", DateTime.Now.ToLongTimeString()));
    Response.Redirect("http://google.com");
}

private static void callback(IAsyncResult ar)
{
    try
    {
        System.Threading.Thread.Sleep(5000); //Emulate slow call.
        HttpWebRequest req = (HttpWebRequest) ar.AsyncState;
        req.EndGetResponse(ar); //ignore result
        Debug.WriteLine(string.Format("[{0}] Request finished!", DateTime.Now.ToLongTimeString()));
    }
    catch (Exception e)
    {
        Debug.WriteLine("Ups.. -> " + e);
        //Log some error eller noget
    }
}


/B
Avatar billede Slettet bruger
03. november 2007 - 09:56 #17
Jamen dog jamen dog... fik det til at virke med inspiration fra dit sidste indlæg :)

Det er bare helt perfekt - så er det lige før jeg kan nå min deadline søndag kl. 23.59 :)

Takker!

God weekend!
Avatar billede Slettet bruger
03. november 2007 - 09:57 #18
bvli: evt. lave et svar - så skal jeg smide nogle point efter dig :)
Avatar billede bvli Praktikant
03. november 2007 - 11:13 #19
svar :)
Avatar billede bvli Praktikant
03. november 2007 - 11:14 #20
Hov.. jeg mener.. 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