aleborgMedlem sedan jan. 20013 341 inlägg Sitter med en kod som hänger sig när man försöker skicka flera connections samtidigt till den. Jag har absolut noll koll på winsock och behöver därför lite hjälp...
i en class har jag följande för att skicka mail:
objMHTML.SendEmail dbMailserver, FromName, FromAddress, ToAddress, Subject, TheBody, ToFirstname & " " & ToLastname, "html"
objMHTML.SendEmail dbMailserver, FromName, FromAddress, AdminAdress, Subject, TheBody, AdminFirstname & " " & AdminLastname, "html"
Ett mail till admin och ett till kunden(det är en webshop men det mesta sker inne i dll:en, ytterst lite i asp-koden)
Eftersom jag försöker skicka 2 mail nästan samtidigt så uppstår ett fel om inte första mailet har skickats iväg innan andra påbörjas. I dom flesta fall så funkar det, men i bland hänger det sig och inget händer!
Det bästa vore om man kunde köra flera instanser av winsock, men om ingen har en lösning på det så är andra lösningar välkomna.
Mail classen är bifogad...
Vore jätteglad för lite konkreta kod förslag!
nikoMedlem sedan juni 20022 599 inlägg En kort fråga till att börja med: Du har inte en mer komplett projektkod? Din klassfil innehåller referenser till ett VB-formulär med en MSWinSock-kontroll på.
Rent allmänt så skulle jag vilja säga att jag anser det vara en mycket dålig idé att använda activeX-komponenter med ett GUI-interface (VB-formulär) och OCX:er inne i IIS:en eftersom VB:s trådmodell (Apartment-threading) kan leda till just problem av den typen du beskriver. Kan alltså vara lönt att försöka hitta en annan gratiskomponent som enbart kör mot API:et? (Har just denna klassen några features som du inte hittar någon annanstans?)
Men jag ska inte säga för mycket. Om du lägger ut hela koden så ska jag titta på den och se om problemet går att återskapa.
aleborgMedlem sedan jan. 20013 341 inlägg Vad jag har förstått så måste man köra med en form för att kunna använda sig av winsock ifrån VB, andra gratiskomponenter är tyvärr inget alternativ...
Det måste gå att skicka mail direkt ifrån DLL:en, eventuellt om man använde sig av mapi, men det måste vara ett sätt som fungerar på alla Win2K server maskiner.
Jag kan inte lägga upp så mycket här, men jag skulle kunna maila det...
nikoMedlem sedan juni 20022 599 inlägg
Vad jag har förstått så måste man köra med en form för att kunna använda sig av winsock ifrån VB
Nej, det måste man inte. Man måste ha en form om man vill använda den MSWinSock-OCX som medföljer VB6. Men däremot går det utmärkt att använda WinSock-API:et från VB utan en form.
Att skapa en form inne i en komponent som kör i IIS:en strider liksom mot alla principer. Dels känns det som om man kan få problem med stabiliteten. Dels så allokerar man resurser i onödan. En komponent ska vara "lean and mean".
andra gratiskomponenter är tyvärr inget alternativ
Får jag fråga varför? CDONTS och JMail innehåller väl samma funktionalitet och mer därtill? De är dessutom väl avprovade.
Jag kan inte lägga upp så mycket här
Det är nog OK. Jag kan själv lägga till ett formulär med en OCX. Jag var mest intresserad av vilka projektinställningar du använder vid kompileringen. Unattended execution, Retained in memory, Threading model osv ..
aleborgMedlem sedan jan. 20013 341 inlägg CDONTS och JMail finns inte installerade på alla servrar!
Var hittar man info om Winsock-API:et? Har inte heller varit glad i att använda form i COM-objectet! Maila mig så kan jag skicka över projektet!
Eftersom det är en ActiveX DLL så kan man inte använda sig av Unattended execution och Retained in memory
nikoMedlem sedan juni 20022 599 inlägg
Eftersom det är en ActiveX DLL så kan man inte använda sig av Unattended execution och Retained in memory
Jo. Det är just om man bygger en ActiveX-DLL som man kan använda dessa. Men nu fattar jag. Du kompilerar alltså som en ActiveX UserControl? Som sagt, utan att ha tittat närmare på koden så skulle jag kanske rekommendera att du skrev det som en COM-dll mot WinSockAPI:et för att slippa overhead och problem.
Här finns rätt mycket info om hur man använder Winsock-API:et i VB: http://www.vbip.com/winsock-api/default.asp.
Längst ner på sidan finns en bas- och classfil som kan användas för att ersätta MSWinsockkontrollen.
Men OK. Jag mailar dig så kan du skicka över projektet och jag lovar att titta lite på det i mån av tid. :)
nikoMedlem sedan juni 20022 599 inlägg Rättelse till mitt förra inlägg:
Om man skapar en ActiveX-DLL och lägger till någon form av GUI så kan man inte längre använda Unattended execution eller Retained in memory (annars kan man).
Så jag antar att du kompilerar som en ActiveX-DLL, trots allt?
nikoMedlem sedan juni 20022 599 inlägg Tja, då har jag testat din dll som hastigast ..
Resultat:
Som du själv skriver så händer ibland en del konstigheter då man skickar flera mail direkt efter varandra. Utan att ha detaljavbuggat så skulle jag vilja tro att det beror på att du använder en asynkron (händelsestyrd) socket, doevents inne i funktionen WaitFor och avsaknad av felhantering på en del ställen. Den asynkrona hanteringen gör att man kan hamna lite varstans i koden och ibland försöka skicka med en socket som egentligen är stängd eller befinner sig i fel tillstånd.
Att använda asynkron sockethantering i en vanlig applikation är ofta en bra idé men i en com-dll som kör inne i IIS:en så känns det mest som en stor källa till potentiella problem.
Fråga:
När jag testade ovan så gjorde jag det för övrigt mest från VB-kod. De gånger jag provade från ASP så kunde jag bara skicka 1(!) mail sen hängde sig IIS:en. Är detta inte något du har märkt av?
Förslag:
1. Bryt ut själva mailklassen ur den övriga dll:en. Jag förstår inte riktigt varför den hör hemma bland dina övriga mer databasbaserade klasser.
2. Ta bort VB-formuläret med OCX:en. Ta bort anropen till doevents och sleep. Skriv om SendEmail så att den kör helt synkront mot enbart socket-API:et.
3. Använd en professionell, avprovad komponent som CDONTS, JMail eller annat. ;) Det angår väl egentligen inte mig, men jag förstod ändå inte riktigt vad du skrev ovan? Eftersom du använder IIS:en så finns väl i praktiken alltid CDONTS tillgängligt? Och dessutom så måste ju din komponent installeras/reggas på samma sätt som tex JMail? Eftersom din mailclass ändå inte innehåller nån specialfunktionalitet som saknas i dessa så tycker jag den lösningen hade känts långsiktigt stabilare?
Slutligen:
Om du vill så kan jag kanske (i mån av tid och förmåga) skriva ihop ett förslag till kod enligt punkt 2 ovan? Dock har jag inte tid eller möjlighet att hålla på att hårdtesta koden, eller att ge några garantier beträffande stabilitet.
Jag kommer också isåf att bryta ut själva mailklassen (punkt 1 ovan) eftersom jag heller inte har nån möjlighet att testa funktionerna i dina övriga klasser (ifall dessa eventuelllt skulle påverkas av någon ändring jag gör i projektinställningarna).
aleborgMedlem sedan jan. 20013 341 inlägg Tyvärr är inte alltid CDONTS eller JMAIL installerat, mailservern Merak stänger av CDONTS som standard(går att sätta på men krångligt)
Som sagt är jag inte så haj på Winsock och dess funktioner, och har bara hittat den koden på https://www.pscode.com
Jag har aldrig märkt att IIS:en hänger sig, men att komponenten gör det och all måste startas om för att kunna användas igen. Koden har ingen exra funktionalitet förutom att den kan skicka mail :e
nikoMedlem sedan juni 20022 599 inlägg
Jag har aldrig märkt att IIS:en hänger sig, men att komponenten gör det
OK. Om man ska vara petig så hänger sig inte hela IIS:en eftersom det fortfarande går att accessa övriga sajter/sidor. Men däremot så går det inte längre att starta om IIS:en via Service Control Managern, utan hela maskinen måste bootas om.
Men som sagt jag ska titta på koden i klassen och återkommer när (om?) jag får ihop nåt. :)