In un precedente post mi lamentavo della scarsa estendibilità della classe MailWebEventProvider e affini , alla fine mi sono deciso a implementare un provider completamente personalizzato, più semplice, senza buffer.
Ho già parlato del Health Monitoring Lo trovo comodo e quando posso mi piace estenderlo.
using System;
using System.Web.Management;
using System.Web;
using System.Net.Mail;
using System.IO;
using System.Collections.Specialized;
using log4net;
namespace TopSeed
{
public class MyTemplatedMailWebEventProvidert : WebEventProvider
{
#region CAMPI PRIVATI
private static readonly object _lockObject = new object();
private static ILog _logger = LogManager.GetLogger("TopSeed");
#endregion
#region PROPRIETA' PUBBLICHE
public string Subject { get; set; }
public string Template { get; set; }
public string To { get; set; }
public string From { get; set; }
#endregion
#region METODI PUBBLICI
public MyTemplatedMailWebEventProvidert() { }
public override void Initialize(string name, NameValueCollection config)
{
base.Initialize(name, config);
lock (_lockObject)
{
Subject = HttpUtility.HtmlEncode(GetAndRemoveConfig("subject", config));
Template = GetAndRemoveConfig("template", config);
To = GetAndRemoveConfig("to", config);
From = GetAndRemoveConfig("from", config);
}
}
public override void ProcessEvent(WebBaseEvent raisedEvent)
{
if (raisedEvent != null)
{
HttpContext.Current.Items.Add("MyTemplatedMailWebEventProvidertCurrentEvent", raisedEvent);
SendMail();
}
}
public override void Shutdown() { }
public override void Flush() { }
#endregion
#region METODI PROTETTI
protected string GetMailBody()
{
using (TextWriter stringWriter = new StringWriter())
{
HttpContext.Current.Server.Execute("~/MailMessage.aspx", stringWriter);
return stringWriter.ToString();
}
}
protected void SendMail()
{
try
{
SmtpClient _smtpClient = new SmtpClient();
using (MailMessage _message = new MailMessage(From, To))
{
_message.Body = GetMailBody();
_message.IsBodyHtml = true;
_message.Subject = Subject;
_smtpClient.Send(_message);
}
}
catch(Exception ex)
{
LogError(ex);
}
}
protected void LogError(Exception ex)
{
_logger.Error("Impossibile inviare la mail", ex);
}
protected void LogInfo(string message)
{
_logger.Info(message);
}
#endregion
#region METODI SATICI
public static WebBaseEvent CurrentNotification()
{
if (HttpContext.Current != null)
{
return (WebBaseEvent)HttpContext.Current.Items["MyTemplatedMailWebEventProvidertCurrentEvent"];
}
else
{
throw new ApplicationException("Impossibile recuperare il contesto http corrente");
}
}
#endregion
#region METODI PRIVATI
private string GetAndRemoveConfig(string key, NameValueCollection config)
{
if (config[key] == null)
{
throw new ApplicationException(string.Format("Impossibile recuperare il campo {0} delle impostazioni", key));
}
else
{
string _value = config[key];
config.Remove(key);
return _value;
}
}
#endregion
}
}
il funzionamento è simile alla classe TemplatedMailWebEventProvider, è possibile specificare una pagina aspx da utilizzare come template, ed è possibile recuperare l'evento corrente per estrarne le informazioni
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- Modificare il controllo TreeView, il 2 dicembre 2008 alle 19:27
- Perfezioniamo il ProfileDataSorce, il 13 ottobre 2008 alle 11:14
- Un DataSource per il Profile, il 10 ottobre 2008 alle 15:06
- TrueSpace 7 gratuito, il 24 luglio 2008 alle 10:59
- adesso dico la mia sull'Iphone, il 22 luglio 2008 alle 10:33
- Come tutto ebbe inizio, il 21 luglio 2008 alle 09:22