/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
[.Net,System.Web.Mail,c#] Problemer med at~
Fra : Jesper Stocholm


Dato : 28-10-02 23:00

Jeg har følgende kode, som er ved at give mig grå hår på hovedet.
Problemet er, at den sender to emails afsted hver gang ... selvom den kun
skulle sende en enkelt.

   strSQL = "<sql der returnerer én række>";
   OdbcDataReader oData = oDb.getData(strSQL);
   string strEmail = "";
   string strFirstName = "";
   int ArticleId = 0;

   if(oData.Read())
   {
       strEmail = oData.GetString(3);
       strFirstName = oData.GetString(1);
       intArticleId = oData.GetInt32(0);
   }

   MailMessage msg = new MailMessage();
   string strBody = "<body-streng>";
   msg.To = strEmail;
   msg.Subject = "subject";
   msg.From = "Moderatorrobot <email@email.dk>";
   msg.Body = strBody;
   System.Web.Mail.SmtpMail.SmtpServer = "mailserver";
   System.Web.Mail.SmtpMail.Send(msg);

Det er ligegyldigt, hvilken adresse jeg sender emailsene til ... der
kommer altid to frem - uanset på hvilken måde jeg vælger at give den en
modtageradresse.

Nogen med nogle gode idéer ? Hvis jeg kigger i kilden til de to emails,
så har de også samme message-id ... hvilket også undrer mig lidt.



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

 
 
Kim Bach Petersen (28-10-2002)
Kommentar
Fra : Kim Bach Petersen


Dato : 28-10-02 23:19

> Nogen med nogle gode idéer ? Hvis jeg kigger i kilden til de to
> emails, så har de også samme message-id ... hvilket også undrer mig
> lidt.

Koden er lige efter bogen, så det er ikke dér fejlen ligger (selv om man
kunne overveje at sætte 'send' i en 'try...catch'-blok for at fange
eventuelle server fejl ved afsendelse, men det er en anden snak).

Du kunne eventuelt sætte en tæller på (sessionsvariabel), så du kan tjekke
at koden ikke bliver kaldt 2 gange?

Er du sikker på, at fejlen kommer fra asp.net og ikke smtp-serveren?

Kim



Jesper Stocholm (29-10-2002)
Kommentar
Fra : Jesper Stocholm


Dato : 29-10-02 09:06

Kim Bach Petersen wrote :

>> Nogen med nogle gode idéer ? Hvis jeg kigger i kilden til de to
>> emails, så har de også samme message-id ... hvilket også undrer mig
>> lidt.
>
> Koden er lige efter bogen


> , så det er ikke dér fejlen ligger (selv om
> man kunne overveje at sætte 'send' i en 'try...catch'-blok for at
> fange eventuelle server fejl ved afsendelse, men det er en anden
> snak).

jeps ... og der er faktisk error-handling indbygget, men for
overskuelighedens skyld er denne og anden non-essentiel kode fjernet.

> Du kunne eventuelt sætte en tæller på (sessionsvariabel), så du kan
> tjekke at koden ikke bliver kaldt 2 gange?

det har jeg prøvet ... og koden afvikles kun én gang.

> Er du sikker på, at fejlen kommer fra asp.net og ikke smtp-serveren?

tja ... jeg har godt nok overvejet det, men jeg kunne ikke helt
forestille mig, at det var dér fejlen skulle ligge. Jeg havde tidligere i
går brugt nøjagtig (næsten) samme kode til at sende andre emails, og der
var ingen problemer på det tidspunkt.

.... måske skal skal tage en snak med jirty ... :)

--
Jesper Stocholm
http://stocholm.dk
http://asp.stocholm.dk
Svar til gruppen og ikke til mig privat pr. email :|

Kim Bach Petersen (29-10-2002)
Kommentar
Fra : Kim Bach Petersen


Dato : 29-10-02 12:54

> tja ... jeg har godt nok overvejet det, men jeg kunne ikke helt
> forestille mig, at det var dér fejlen skulle ligge. Jeg havde
> tidligere i går brugt nøjagtig (næsten) samme kode til at sende andre
> emails, og der var ingen problemer på det tidspunkt.

Jeg er blank ellers - jeg har endnu ikke oplevet knuder med
System.Web.Mail...

Kim

--
· www.kensho.dk · psykologi og spiritualitet ·



Jesper Stocholm (30-10-2002)
Kommentar
Fra : Jesper Stocholm


Dato : 30-10-02 19:32

Kim Bach Petersen wrote :

>> tja ... jeg har godt nok overvejet det, men jeg kunne ikke helt
>> forestille mig, at det var dér fejlen skulle ligge. Jeg havde
>> tidligere i går brugt nøjagtig (næsten) samme kode til at sende andre
>> emails, og der var ingen problemer på det tidspunkt.
>
> Jeg er blank ellers - jeg har endnu ikke oplevet knuder med
> System.Web.Mail...

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).

Min kode, der sender emails ser således ud (det hele)

private void Page_Load(object sender, System.EventArgs e)
{
int intCompare = new int();
try
{
string strCheck = Request.QueryString["intArticleId"].ToString() + Request.QueryString["intApproverId"].ToString() + Request.QueryString["intApprove"].ToString() + Application["initVector"].ToString();
intCompare = String.Compare(Request.QueryString["checksum"].ToString(),System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strCheck,"SHA1"),false);
}
catch (Exception Err)
{
lShaCalc.Text = "ERROR: Der mangler noget data."
}

if (intCompare == 0)
{
approveDenyArticle(Convert.ToInt32(Request.QueryString["intArticleId"]),Convert.ToInt32(Request.QueryString["intApproverId"]),Convert.ToInt32(Request.QueryString["intApprove"]));
}
else
{
lShaCalc.Text = "Der skete en fejl i validering af data.";
}
}

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);

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);
while(oData.Read())
{
MailMessage msg = new MailMessage();
string strEmail = oData.GetString(3);
msg.To = strEmail;
msg.Subject = "Godkendelse af artikel. " + DateTime.Now.ToString();
msg.From = "Moderatorrobot";
string strBody = "Hej " + oData.GetString(1).ToString();
msg.Body = strBody;
System.Web.Mail.SmtpMail.SmtpServer = "mail";
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.

??

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

Torben Brandt (31-10-2002)
Kommentar
Fra : Torben Brandt


Dato : 31-10-02 00:25

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 :)

> 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"]

>
> 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["intArticleId"]),Convert.ToInt32(Request.QueryString["intApproverId"]),Convert.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.
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 :) ]

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.

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. Jeg ville mene at det skulle være ved "Note 3", er det også dér du har målt?


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

--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP ???
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Jesper Stocholm (31-10-2002)
Kommentar
Fra : Jesper Stocholm


Dato : 31-10-02 09:24

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

Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408952
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste