La thématique de l'outil de traces est ancienne comme le monde des développeurs. Il faut toujours pouvoir tracer son programme et retirer ces traces au moment du déploiement.
Alors parmi tous les outils de traces mon regard se tourne vers
Log4Net et puis-je l'utiliser avec Silverlight ?
Un bon tutoriel mais en anglais
ici.
La page la plus intéressante sur ce sujet pour moi, se trouve
ici. On y apprend que l'on ne pourra pas utiliser directement Log4Net avec Silverlight car aucune des builds n'est réalisée avec ce framework :
Log4Net Supported Frameworks.
Qu'il est inutile de tenter de compiler les sources de Log4Net avec Silverlight, étant donné les restrictions de ce dernier, il n'est pas possible d'avoir accès au système de fichiers côté client et donc de créer un fichier de logs.
On y donne également le début d'une solution : Utiliser l'application ASP.NET qui host le .xap de Silverlight pour faire une référence à la DLL log4net. Vous n'avez plus qu'à développer un service web qui permettra à Silverlight d'utiliser Log4Net.
Voici donc le projet :
Une Business application for Silverlight 5.0
Une Asp.net application qui host le .xap et qui aura une référence sur la dll log4net.
Un WCF Service dans l'application asp.net que l'on va rendre utilisable depuis Silverlight.
Le tout pour faire des Logs dans un fichier texte.
Silverlight Business Application for Log4Net
Je créé une application Business pour Silverlight que je nomme BusinessApplicationLog4Net :
|
Silverlight Business Application BusinessApplicationLog4Net |
Je créé une référence à la DLL log4Net que j'ai installée :
|
Référence à log4net dans mon projet BusinessApplicationLog4Net |
ASP.NET Business Application and Log4Net afficher des traces
Installation d'un bouton et d'un TextBox dans l'application asp.net afin de faire des logs.
Dans la Silverlight Business Application, derrière la page BusinessApplicationLog4NetTestPage.aspx il n'y a pas de code behind, je souhaite pourtant faire des logs à partir d'un bouton de cette page. Je une nouevelle page BusinessApplicationLog4NetTestPage.aspx cette fois avec son code behing et je copie le cope nécessaire l'embarquement du .xap. Je peux ainsi ajouter mon bouton et déclencher du code derrière :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Collections;
// Here is the once-per-application setup information
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace BusinessApplicationLog4Net.Web
{
public partial class BusinessApplicationLog4NetTestPage : System.Web.UI.Page
{
// Should be declared for each class
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
protected void Page_Load(object sender, EventArgs e)
{
log.Debug("Page Loaded");
}
private static int nbLogs = 0;
protected void ButtonMakeLog_Click(object sender, EventArgs e)
{
log.Debug("ButtonMakeLog_Click");
TextBoxLog.Text = "nbLog " + nbLogs.ToString();
log.Debug(TextBoxLog.Text);
nbLogs++;
}
}
}
Pour faire des logs il me faut encore trois choses :
le déclenchement d'une fonction d'assembly XmlConfigurator
la déclaration d'une variable log
l'appel à la fonction log que je fais depuis la page Page_Load
ASP.NET and Log4Net web.config
Remarque importante :
Je me suis égaré en lisant le tutoriel dans la création d'un fichier de configuration pour Log4Net à part : Log4Net.config mais cela ne fonctionnait pas.
Il faut avoir à l'esprit les limitations des applications asp.net qui sont sécurisées et mon application ne trouvait jamais le fichier Log4Net.config je pris donc le parti de configurer mon Log4Net dans le fichier Web.config
Pour les logs, je créé un répertoire Log auxquels je donne accès à "Tout le monde".
Et je lance mon application :
|
Silverlight Business Application for Log4Net |
Et maintenant pour afficher mes logs, je tape l'url suivante :
http://localhost:52878/Log/log.txt
Et les logs s'affichent dans mon navigateur :
|
ASP.NET Business Application afficher les logs |
WCF Service for Service references in RIA application
Pour que mon application Silverlight puisse elle aussi faire des logs avec Log4Net, je créé un WCF Service hosté par mon application ASP.NET que je nomme ServiceLogger :
|
WCF Service Logger |
Je ne fais pas le détail du code, vous pourrez télécharger ce code source en bas de cet article.
Pour utiliser ce service dans mon application Siverlight il faut lui ajouter une Service Refrence :
|
Silverlight Application Add Service Reference |
En suite je clique sur "Discover" pour découvrir les Services installés au sein de ma solution :
Pour découvrir les fonctionnalités de mon service, je clique sur ServiceLogger.svc et là je tombe sur l'erreur :
|
WCF Service Hosted by ASP.NET application - Error while attempting to find services |
La solution détaillée de cette erreur se trouve
Ici.
Une fois les lignes :
using System.ServiceModel.Activation;
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
Ajoutées dans mon services, et :
Remarque importante : La création de WCF Services comme bien d'autres objets entraîne du code généré afin de le mettre à jour ne pas hésiter à "Cleaner" la solution.
J'obtiens enfin mon ServiceReference que je nomme "ServiceLogger" :
|
Silverlight WCF Ria Services |
Silverlight make logs using Service References
Je rajoute un bouton et un textbox dans la page home de mon application Silverlight.
Le code de mon bouton est le suivant :
private int nbLogs = 0;
private void buttonMakeLog_Click(object sender, System.Windows.RoutedEventArgs e)
{
var log = new ServiceLogger.ServiceLoggerClient();
log.LogMessageAsync("Click on button will produced log on server" + nbLogs.ToString());
textBox.Text = "log " + nbLogs.ToString();
nbLogs++;
}
Je l'exécute et je joue un peu avec :
|
Silverlight utilise un Service Reference et Log4Net pour afficher des traces |
Et j'affiche mes traces :
|
Grâce à Log4Net mon application Silverlight fait des traces dans ASP.NET |
Conclusion
Oui c'est délicat de mettre en oeuvre l'ensemble de ces technologies surtout avec Silverlight et ASP.NET. Au début du projet, on ne peut pas être certain d'aboutir puis on trouve des astuces des contournements. En développant il faut bien garder à l'esprit les différentes limitations des applications Silverlight et ASP.NET en général c'est cela qui permet de trouver une solution.
Download Source Code
Requirements :
Visual Studio 2010
Silverlight 5.0
Log4Net
Download Source Code