Il client SMTP è stato creato in ambito Singleton o nell'ambito della richiesta?

0

In un'applicazione web, creiamo un provider di posta elettronica, che a sua volta crea un client SMTP: la mia domanda è se dovremmo creare un client SMTP per richiesta o creare un solo client e farlo soddisfare tutte le richieste?

Qual è il modo migliore per utilizzare un client SMTP? Stiamo solo inviando (non ricevendo) email.

    
posta Ankit Rana 18.11.2016 - 06:17
fonte

2 risposte

1

Poiché SmtpClient non è completamente thread-safe e non può inviare più e-mail contemporaneamente, l'unico modo per creare una soluzione scalabile e performante è creare il proprio pool di istanze SmtpClient.

Una semplice implementazione sarebbe sulla falsariga di

  • Scrivi una classe EmailSender e registrati come singleton con il tuo contenitore IOC. Falla creare una coda di SmtpClients all'inizializzazione e mantieni un riferimento privato alla coda.
  • Quando l'applicazione invia un'email, blocca la coda e prende uno SmtpClient dalla coda se ce n'è uno. Se la coda è vuota, costruisci invece un nuovo SmtpClient.
  • La versione sincrona è più facile perché basta avvolgere il send in try / finally e aggiungere lo SmtpClient alla coda nella parte finale.
  • La versione asincrona è leggermente più complicata ma anche possibile.
  • Fai attenzione a reimpostare SmtpClient in uno stato di partenza valido prima di aggiungerlo alla coda. Fai particolare attenzione quando l'invio fallisce.
  • Smaltire facoltativamente SmtpClients anziché aggiungerli al conteggio della coda supera una soglia configurabile.

Esiste anche una versione più complicata in cui si inviano un sacco di e-mail molto simili. In questo caso è possibile avere più pool che inizializzano SmtpClients per ogni tipo di email inviata dall'applicazione.

    
risposta data 23.12.2017 - 04:33
fonte
0

Microsoft non garantisce che il i metodi di istanza di SmtpClient sono thread-safe . Utilizzare SmtpClient.SendMailAsync per consentire allo stesso thread di eseguire altre attività durante l'invio di messaggi. Inoltre, non è possibile inviare altri messaggi mentre SmtpClient invia un messaggio se si controllano i commenti per SmtpClient.Send :

You cannot call this method if there is a message being sent asynchronously.

La tua scommessa più sicura è inizializzare ogni volta un nuovo SmtpClient. Lo sto facendo per migliaia di e-mail inviate in modo asincrono su un economico server 1-core ram da 1 gb.

    
risposta data 25.08.2017 - 01:01
fonte

Leggi altre domande sui tag