Avatar billede it-dyret Nybegynder
19. august 2006 - 17:40 Der er 11 kommentarer og
2 løsninger

Håndtering af 2 (eller flere) requests

Hej!

Jeg har et meget generelt spørgsmål, nemlig hvordan man håndterer 2 (eller flere) requests fra samme side, på en måde så serveren kun reagerer på ét af disse requests?

Jeg ved ikke, om der er en generisk løsning eller om det er anhængig af konteksten... Men hvis det sidste er tilfældet (eller blot for eksemplets skyld), så forstil jer en side, som ved request f.eks. sender en mail eller skriver ned i en database - og sender brugeren videre til en ny side. Hvis ellers hastigheden er top i helt, kan brugeren ikke nå at trykke mere end 1 gang, men det sker jo relativt tit, at der er nok forsinkelse til at det kan lade sig gøre...

I ovenstående eksempel vil der blive sendt 2 (eller flere) mails eller blive skrevet 2 (eller flere) gange i databasen, hvilket ikke er hensigtsmæssigt. Ja, nogle gange kan det ligefrem være fatalt.

Men hvordan forhindrer jeg, at det sker?
Avatar billede arne_v Ekspert
19. august 2006 - 18:04 #1
en måde er token pattern
Avatar billede Slettet bruger
19. august 2006 - 18:05 #2
En løsning er at selecte dit indlæg efter du har indsat det og slette hvis der forekommer mere end et - skal ikke kunne sige om der er en smartere:

connection.execute "INSERT INTO [forum] ([user],[message],[forumid]) VALUES ('" & username & "','" & message & "'," & forumid & ")"

sql = "SELECT [id] FROM [forum] WHERE [user] = '" & username & "' AND [message] = '" & message & "' AND [forumid] = " & forumid & " AND DATEDIFF('S',[date],NOW()) < 60"
rs.open sql, connection
if not rs.eof then
rs.movenext
end if
do while not rs.eof
  connection.execute "DELETE FROM [forum] WHERE [id] = " & rs("id")
loop
Avatar billede arne_v Ekspert
19. august 2006 - 18:06 #3
formen submitter et tal (hidden field) som gemmes i session

processing af submit sammenligner tal med det i session og tæller det i session op
Avatar billede it-dyret Nybegynder
19. august 2006 - 18:32 #4
Umiddelbart er jeg mest til arne v's løsning, hvor jeg går ud fra, at beskrivelsen matcher "token pattern".

Da jeg altid er sulten efter at lære mere, så bider jeg mærke i, at der står "en måde" i kommentarer... Hvilke andre muligheder ser du?
Avatar billede Slettet bruger
19. august 2006 - 18:57 #5
Jeg hælder også mest til Arnes løsning..

At javascript låser formen er måske også en løsning. jeg har ikke prøvet det før - var lige noget jeg kom på - men du kan jo prøve dig frem.. det viser også brugeren at formen er blevet sendt..

<form method='post'  onsubmit='this.submit.disabled = true;'>
    <input type='text' name='sdf'>
    <input type='submit' name='submit'>
</form>

/1.
Avatar billede dr_chaos Nybegynder
19. august 2006 - 19:16 #6
du laver bare en knap som der kun kan trykkes på engang:

knap:
<asp:Button ID="Action" OnLoad="btn_load" OnClick="Action_Click" runat="server" CssClass="button" Text="test" />


i codebehind laver du:
  protected void btn_load(object sender, EventArgs e)
    {
        //script som forhindre at bruger trykker mere end en gang
        Button btn = (Button)sender;
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        sb.Append("if (typeof(Page_ClientValidate) == 'function') { ");
        sb.Append("if (Page_ClientValidate() == false) { return false; }} ");
        sb.Append("this.value = 'Vent venligst...';");
        sb.Append("this.disabled = true;");
        sb.Append(ClientScript.GetPostBackEventReference(btn, ""));
        sb.Append(";");
        btn.Attributes.Add("onclick", sb.ToString());
    }
Avatar billede dr_chaos Nybegynder
19. august 2006 - 19:18 #7
På den måde sikre du også at hvis der er noget validering af ting på siden foretages denne før siden submittes.
Avatar billede dr_chaos Nybegynder
19. august 2006 - 19:20 #8
Med lidt tilpasning kan den bruges til dropdownlister og andet.
Avatar billede it-dyret Nybegynder
19. august 2006 - 20:09 #9
Mange tak for de gode forslag! De bliver prøvet af i løbet den kommende uge...

Er der flere gode forslag, er de meget velkomne :)
Avatar billede it-dyret Nybegynder
06. september 2006 - 22:38 #10
Jeg beklager den lange respons-tid... Løsningen blev en anden end en af de skitserede - primært da der blev fundet en quick-fix løsning, som klarer problemet hurtigt og "godt nok". Og quick-fix var et must, da applikationen allerede var i drift og der ikke var afsat ressourcer til at lave andet end en meget hurtig løsning.

Kort fortalt får alle kontrols på alle sider, der poster siden, følgende JavaScript, som åbner et pop-up vindue med teksten "vent venligst...". Det gode i løsningen er, at den umuliggør klik på samtlige kontrols på én gang, men til gengæld forsvinder pop-up vinduet, når der bliver klikket på det blot én gang. Men det viste sig ikke at være noget problem i praksis.

Det script, der bliver indsat på hver controls onClick event var følgende:

string scriptName = "WaitPopUp";
string script = "";
script += "<script language='javascript'>\n";
script += "  function WaitPopUp(){\n";
script += "    var oPopup = window.createPopup();\n";
script += "    var width = document.body.clientWidth;\n";
script += "    var height = document.body.clientHeight;\n";
script += "    oPopup.document.body.innerHTML = ";
script += "\"<table width='100%' height='100%'><tr><td align='center' valign='center'>Vent venligst...</td></tr></table>\"\n";
script += "    oPopup.show(0, 0, width, height, document.body);\n";
script += "  }\n";
script += "</script>\n";
if(!IsStartupScriptRegistered(scriptName))
{
    RegisterStartupScript(scriptName, script);
}

Endnu engang mange tak for de gode forslag, som helt sikker kommer med i værktøjskassen til næste applikation - specielt token pattern!

Alle der er kommet med et løsningsforslag, må gerne smide et svar, så jeg kan fordele point.
Avatar billede arne_v Ekspert
07. september 2006 - 02:54 #11
ok
Avatar billede dr_chaos Nybegynder
07. september 2006 - 08:01 #12
svar :)
Avatar billede it-dyret Nybegynder
07. september 2006 - 17:40 #13
Jeg har valgt at dele pointene lige mellem de to forslag, som vil komme med i værktøjskassen til en anden gang - og det passer også fint med de to, som har efterkommet opfordring om at smide et 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