un Provider Custom per l'health monitoring

di Marco Leoncini, in asp.net,

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

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese