Torben Brandt wrote :
> Jesper Stocholm wrote in dk.edb.internet.webdesign.serverside.asp:
>>
> Nu er .Net og C# ikke lige min hjemmebane, men der er vist knuder på
> snoren, så jeg kommer med et par gæt :)
al hjælp er velkomment :)
>> nej, jeg er også totalt blank. Jeg har nu fået vished for, at der
>> rent faktisk sendes to emails med forskelligt msg-id og forskellig
>> subject (indsætter den aktuelle tid, og der er ofte forskel på et
>> sekunds tid).
>
> Når der bliver sendt forskellig tid med i nogle tilfælde, kunne det så
> ikke tyde på at selve mail-afsendelses-koden afvikles to gange... [Læs
> lidt videre :) Jeg har markeret 3 steder i din kode, med "Note X"]
Jeg har sent i aftes kigget lidt mere på det, og jeg har - vil jeg
sige - hacket mig ud af det.
Jeg har lavet følgende konstruktion
private void Page_Load() {
if (Session[Request.QueryString["intArticleId"].ToString()] == null)
{
Session[Request.QueryString["intArticleId"].ToString()] = true;
approveDenyArticle(Convert.ToInt32(Request.QueryString["intArticleId"]),Convert.ToInt32(Request.QueryString["intApproverId"]),Convert.ToInt32(Request.QueryString["intApprove"]));
}
else
{
}
}
og nu sendes der kun én mail. Det virker altså som om, at
Page_Load-eventen afvikles to gange. Jeg vil dog kommentere dine
kommentarer trods alt ... :)
>> Min kode, der sender emails ser således ud (det hele)
>>
>> private void Page_Load(object sender, System.EventArgs e)
>> {
> <snip>
>> if (intCompare == 0)
>> {
>> approveDenyArticle(Convert.ToInt32(Request.QueryString["intArticle
>> Id"]),Convert.ToInt32(Request.QueryString["intApproverId"]),Conver
>> t.ToInt32(Request.QueryString["intApprove"]));
>> }
> <snip>
>> }
>>
>> private void approveDenyArticle(int intArticleId,int
>> intApproverId,int intApprove) {
>> if (intApprove == 1)
>> {
>> string strSQL = "UPDATE table1 set tintApproved = 1,intApproverId
>> = " + intApproverId.ToString() + " WHERE id = " +
>> intArticleId.ToString(); dbmySQL oDb = new dbmySQL();
>> int intRows = oDb.updateData(strSQL);
> --> Note 1 !
>
>>
>> if (intRows == 1)
>> {
>> strSQL = "SELECT f.id,a.strFirstName,a.strLastName,a.strEmail
>> FROM table1 f INNER JOIN table1 a ON a.intAuthorId =
>> f.intAuthorId WHERE f.id = " + intArticleId.ToString();
>> OdbcDataReader oData = oDb.getData(strSQL);
> --> Note 2 !
>
>> while(oData.Read())
>> {
>> MailMessage msg = new MailMessage();
> <snip>
>> System.Web.Mail.SmtpMail.SmtpServer = "mail";
> --> Note 3 !
>
>> System.Web.Mail.SmtpMail.Send(msg);
>> }
>> }
>> }
>> }
>>
>> Så vidt jeg kan konkludere, så bliver funktionen approveDenyArticle()
>> kun kaldt én gang ... Den anden funktion i en anden fil, der også
>> udsender emails, virker uden problemer. Koden er stort set ens.
>>
> Ja, jeg tror også kun den kaldes én gang, men sender ét funktionskald
> mere end én mail?
>
> Mit bud går på at det SQL-kald der er markeret med "Note 1" ovenfor må
> opdatere præcis én record, da der ellers ikke bliver sendt nogle
> mails.
Det gør den også ... altså returnerer én record
> Men ved "Note 2", udtages der med den samme WHERE-clause, men
> det er efter der er lavet et INNER JOIN, så kan det ikke tænkes at der
> (evt pga forkert data i databasen) kommer to records, hvor
> WHERE-clausen er sand. På denne måde så er der to records i 'oData'
> ved "Note 2". [Evt udskriv antallet på dette tidspunkt, bare for at
> være sikker :) ]
Jeg tror ikke, at det er det. Dette ville betyde, at der kom to
gennemløb af løkken, men de tællere jeg indsatte viste, at det ikke
var tilfældet. Jeg har også senere ændret koden, så hver SQL-streng
får hver sin variabel ... for at undgå, at der skulle gå ged i det.
> Uanset om dette er problemet, så skriver du lige efter "Note 2"
> 'while(oData.Read())'. Som sagt tidligere så kender jeg ikke .Net, men
> som jeg lige kunne finde, så ligner det at du gentager sålænge der er
> records.
> Hvis der kun er én record, kunne dette så ikke laves som en
> If-sætning, for så var du sikker på at den kun blev kaldt én gang.
Det er også prøvet ... :) ... men gav samme opførsel.
> Du skriver vist i et af dine indlæg at du har målt efter at den kun
> kaldes én gang, men hvor i programmet har du målt dette.
Denne kode er fjernet for overskuelighedens skyld.
> Jeg ville
> mene at det skulle være ved "Note 3", er det også dér du har målt?
Jeg indsatte tællere strategiske steder i koden, der blev forhøjet med
forskellige værdier - alt efter hvor det skete. Dermed kan jeg se, hvor
tælleren er blevet opdateret. Alle mails blev afsendt med nøjagt
samme værdi for tælleren - hvilket imo indikerer, at det er hele koden,
der bliver afviklet to gange.
> Det var lige et par skud, jeg ved ikke om det er der problemerne
> ligger, men dumt ikke at sige noget, hvis det faktisk var dér
mvh
> Torben
præcist ... og jeg takker da også for din tid. Jeg tror, at problemet
skyldes, at hele kode afvikles to gange - men er der nogen, der ved
hvad dette kan skyldes ? I min HTML-side står der (bla.)
<%@ Page language="c#" src="default.aspx.cs" Inherits="aspfaq.admin.approveArticle._default" %>
<!DOCTYPE
html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<html>
<head>
<meta name="GENERATOR" content="Microsoft Visual Studio 7.0"/>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<link rel="stylesheet" href="/style/" type="text/css" media="screen"/>
</head>
Mit sidste bud er noget med EventWirering ... men jeg tror ikke helt,
at det er årsagen.
--
Jesper Stocholm
http://stocholm.dk
Overvejer du at købe bøger ved saxo.dk ? Kig først på
http://www.firmcheck.dk/Info.asp?website=www.saxo.dk