Spam checker API avec ASP.NET C# - Comment éviter le SPAM avec stopforumspam

 01/01/2019 |   Admin |  C#


Avoir rencontré plusieurs problemes de spam dans certaines de mes applications j'ai décidé de me pencher sur le sujet. Apres avoir étudié différentes solutions je décide d'utiliser l'API gratuite du site stopforumspam.

Elle est gratuite, simple d'utilisation et communautaire, c'est pourquoi il ne faut pas hésiter a envoyer la liste de ses potentiels spammeurs sur ce forum.

Il y a juste une limite de 20000 requets a ne pas dépasser par jour, ce qui est correcte.

Pour moi le nom d'utilisateur n'est pas assez fiable pour savoir si c'est un spam ou non. C'est pourquoi la détection va se faire premierement par l'adresse IP de l'utilisateur puis par l'email.

Cette API est tres fiable mais l'adresse IP peut etre lié a un autre utilisateur par exemple. Si vous voulez filtrer des commentaires je vous conseille donc de ne pas les supprimer mais de les marquer avec un tag IsSpam = 1

C'est cadeaux, voici la classe:

///<summary>
/// SpamChecker class
///</summary>
public class SpamChecker
{
    ///<summary>
    /// Check if the comment is inside the spam list
    ///</summary>
    ///<param name="ip">The ip to test</param>
    ///<param name="email">The email to test</param>
    ///<returns>True if it's a spam</returns>
    public static bool Check(string ip, string email)
 
...

Lire >>

Convertir des pages HTML en PDF en .Net

 01/01/2019 |   Admin |  C#


De nombreux moyens existent pour convertir une page html (ou asp) en pdf.

Après quelques tests et recherches, la façon qui me semble la plus simple est d'utiliser la dll TuesPechkin.

TuesPechkin utilise wkhtmltopdf, un outil puissant pour générer des pdfs, mais lourd à mettre en place. TuesPechkin utilise webKit pour générer du code html en pdf. Il apporte en plus le support 32 et 64 bits. Le gros avantage est qu'il n'y a pas besoin d'installer l'exécutable wkhtmltopdf sur le serveur.

Voici un exemple d'utilisation :

public class PdfGenerator
{
        public static byte[] HtmlToPdfBytes(string html, string documentTitle = "Document Pdf")
        {
            var document = new HtmlToPdfDocument
               {
                   GlobalSettings =
                   {
                       ProduceOutline = true,
                       DocumentTitle = documentTitle,
                       PaperSize = PaperKind.A4, // Implicit conversion to PechkinPaperSize
                       Margins =
                       {
                           All = 1.375,
                           Unit = Unit.Centimeters
                       }
                   },
                   Objects = {
                        new ObjectSettings { HtmlText = html},
               
...

Lire >>

Utiliser le cache de type DONUT avec asp.net mvc4

 01/01/2019 |   Admin |  C#


Introduction

Pour être simple, le cache Donut est utilisé pour mettre en cache une page entière SAUF une partie de la page. Le nom vient d'ailleurs de la !! le gateau avec le trou !

Avec MVC, le gros avantage c'est que l'on pourra s'affranchir du cache pour certaines vues partielles

Le cas le plus souvent rencontré

En fait j'ai décidé d'écrire cet article, après avoir plusieurs fois rencontré sur des forums, un problème de sécurité concernant la vue partielle _LoginPartial.cshtml

Si vous mettez en place un système d'authentification et que vous utiliser le cache comme dans l'exemple suivant, vous aurez un problème.

public class HomeController : Controller
{
[OutputCache(Duration=3000, Location= System.Web.UI.OutputCacheLocation.Server)]
public ActionResult Index()
{
ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
return View();
}
}

Essayez de vous connecter à votre application avec un premier navigateur (ou ordinateur):

Hello + votre nom d'utilisateur s'affiche correctement

Puis, naviguer sur votre application depuis un autre navigateur ou ordinateur sans s'y être connecté:

Problème: la visite précédente a mis en cache certaines informations qui ne doivent pas être affichées à tout le monde. Il s'agit seulement d'un nom d'utilisateur mais imaginons quelque chose comme:

@if (User.IsInRole("Manager"))
{
Prix d'achat: @Model.PrixAchat
}

Ici, si la première mise en cache s'est faite par un utilisateur disposant du droit "Manager", tous les prochains visiteurs verront le prix d'achat affiché sur le site !

Solution

Utiliser le package MvcDonutCaching (Depuis Visual Studio, clique droit sur le projet, nuget packages, MvcDonutCaching)

Ensuite, l'utilisation du cache reste identique, à la seule différence que l'attribut se nomme [DonutOutputCache()]

 

Si on prend comme exemple le cas précédent (Avec le template de base MVC4, internet application), le code du controlleur de la page Index devient:

[DonutOutputCache(Duration = 3000, Location = System.Web.UI.OutputCacheLocation.Server)]
public ActionResult Index()
{
ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
return View();
}

On déplace la vue partielle _LoginPartial.cshtml du dossier Shared vers le dossier Account

Puis on ajoute une méthode d'action dans le controlleur "Account" :

[Authorize]
[InitializeSimpleMembership]
public class AccountController : Controller
{
[AllowAnonymous]
public ActionResult _LoginPartial()
       {
              return PartialView();
       }
….
 
….

Enfin, on désactive le cache pour la vue partielle de cette facon:

@Html.Action("_LoginPartial", "Account", true)

true permet d'indiquer que l'on ne veut pas de cache pour cette vue. (MvcDonut ajoute cette propriété automatiquement au HtmlHelper)

Note: l'attribut suivant est utilisé pour cette démo.

[DonutOutputCache(Duration = 3000, Location = System.Web.UI.OutputCacheLocation.Server)

Dans la vraie vie il est préférable d'utiliser le web.config comme suivant:








Puis changer l'attribut:

[DonutOutputCache(CacheProfile="Cache50Minutes")]

L'intéret est que si l'on désire changer la valeur d'un attribut, on pourra le faire a un seul endroit. Demo

En rouge l'on peut voir que la page est en cache, en vert la vue est rechargée à chaque action !

Laisser un commentaire pour toute question sur la cache

Merci

Lire >>

Utiliser Twitterizer en .Net - Tutorial

 01/01/2019 |   Admin |  C#


Twitterizer est une dll qui permet de communiquer avec l'API de twitter pour poster un tweet, lire des informations sur un utilisateur, répondre a un tweet, obtenir des images, faire des recherches avec un hashtag. Bref tout ce dont vous avez besoin !

Site officiel : http://www.twitterizer.net/

Avant de commencer

il faut créer une application twitter avec les paramètres Read/write à cette adresse : https://dev.twitter.com/

(Si vous aviez une application read only il faudra réinitialiser les tokens après avoir changé le mode)

Dans cet example on simulera une simple application console pour simplifier la compréhension.

Créer un nouveau projet console puis ajouter un fichier app.config. Ce fichier servira a stocker les tokens de sécurité obtenus précédemment ainsi que la requète.

Fichier app.config

<?xmlversion="1.0"?>
<configuration>
  <appSettings>
    <!-- tokens-->
    <add  key="ConsumerKey"value="xxxxxx"/>
    <add  key="ConsumerSecret"value="xxxxxx"/>
    <add  key="AccessToken"value="xxx-xxx"/>
    <add  key="AccessTokenSecret"value="xxxxxx"/>
    <addkey="WordsToSearch"value="#twitter, twitter "/>
  </appSettings>
</configuration>

Ajouter la dll twitterizer au projet. Un package nuGet existe mais à l'heure ou j'écris cet article il y a un problème de

...

Lire >>

Insérer un logo et un texte dans une image en .Net

 01/01/2019 |   Admin |  C#


Dans ce poste je vais expliquer comment insérer un logo et un texte dans une image. Ce principe est souvent utilisé a des fins de Copyright.

Résultat désiré:

Image de base :

 

Logo a insérer :

Texte a insérer :

Hello I am a text on this image

Code de la fonction :

///<summary>
/// Setup th copyright
///</summary>
///<param name="fileName">The file name</param>
public static void SetCopyright(string fileName)
{
// Dossier contenant les images
string workingFolder = HttpContext.Current.Server.MapPath("~/Images");
  
Image image = Image.FromFile(workingFolder + "/Content/" + fileName); // Image principal
Image logo = Image.FromFile(workingFolder + "/Copyright-Symbol.jpg"); // Logo a insérer
string text = "Hello I am a text on this image"; // Texte a insérer
  
Brush textColor = new SolidBrush(Color.FromArgb(255, 214, 65, 95)); // Couleur du texte (Peut-etre simplifié : Brushes.Orange;)
Font textFont = new Font("Impact", 12, FontStyle.Bold); // Font family du texte
  
Graphics gImage = Graphics.FromImage(image); // Création d'un objet de type graphic pour pouvoir insérer l'image et le texte
  
float textWidth = gImage.MeasureString(text, textFont).Width; // Obtenir la taille du futur texte pour les calculs de positionnement
  
Bitmap transparentLogo = new Bitmap(logo.Width, logo.Height); // Bitmap pour obtenir le logo transparent
Graphics gLogo = Graphics.FromImage(transparentLogo); // Objet graphic pour permettre de dessiner
  
ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.Matrix33 = 0.25F; // Le 3eme élément de la 4eme ligne de la matrice d'une image correspond a la transparence
  
ImageAttributes imgAttributes = new ImageAttributes();
imgAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); // Application de la matrice
  
// Insertion du logo dans l'image de base en haut a droite
gLogo.DrawImage(logo, new Rectangle(0, 0, transparentLogo.Width, transparentLogo.Height), 0, 0, transparentLogo.Width, transparentLogo.Height, GraphicsUnit.Pixel, imgAttributes);
gLogo.Dispose();
  
// Insertion du texte dans l'image de base en bas au centre
gImage.DrawString(text, textFont, textColor, new PointF((image.Width - textWidth) / 2, image.Height - 20));
gImage.DrawImage(transparentLogo, image.Width - logo.Width, 0);
  
// Sauvegarde (ici dans le dossier Content/Copyright)
image.Save(workingFolder+ "/Content/copyright/" + fileName), ImageFormat.Jpeg);
}

Lire >>

Utiliser plusieurs web.config dans un projet web asp.net sous visual studio 2010

 01/01/2019 |   Admin |  C#


1) Créer les 3 configurations suivantes si elles n’existent pas

a. Debug : Par défaut, utilisé sur le poste local du développeur

b. Deploy : utilisé pour le serveur de développement

c. Release : utilisé pour le serveur de production

 

Pour ajouter une nouvelle configuration, aller dans le gestionnaire de configuration (ci-dessus)

Cliquer sur nouveau puis saisir le nom de la nouvelle configuration (ex : Deploy , copier les paramètres à partir de release)

2) Une fois les 3 configurations crées il suffit de faire un clique droit sur le fichier web.config puis « Ajouter des transformations de configuration » (Si les fichiers n’ont pas déjà été créés)

 

3) Modifier les fichiers suivant vos besoins

Exemple : Le cas ou le IIS du serveur de développement est différent du poste du développeur. Il faut déplacer les modules et les handlers.

La section <System.web> du fichier web.config :

<system.web> 
    <pages theme="Defaut"> 
      <controls> 
        <add tagPrefix="…" namespace="…" assembly="…"/> 
      </controls> 
    </pages> 
    <httpModules> 
      <add name="…" type="…, …"/> 
    </httpModules> 
    <httpHandlers>
      <add verb="*" path="*.aspx" type="…"/>
      <add verb="*" path="*.asmx" type="…"/>
    </httpHandlers>
    <compilation debug="true" targetFramework="4.0">
    </compilation>
  </system.web>
  <system.webServer>
  </system.webServer>

La même section dans le fichier Web.Deploy.config :

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.web xdt:Transform="Replace">
    <pages theme="Defaut">
      <controls>
        <add tagPrefix="…" namespace="…" assembly="…"/>
      </controls>
    </pages>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
  </system.web>
  <system.webServer xdt:Transform="Replace">
    <validation validateIntegratedModeConfiguration="false"/>
    <modules>
      <add name="…" type="…, …"/>
    </modules>
    <handlers>
      <add name="…" verb="*" path="*.aspx" type="…, …"/>
      <add name="…" verb="*" path="….ashx" type="…, …"/>
    </handlers>
  </system.webServer>
</configuration>

 

Pour remplacer toute une section il faut ajouter l’élément xdt:Transform="Replace"

Pour supprimer un attribut il faut rajouter xdt:Transform="RemoveAttributes(l’attribut à supprimer)"

4) Pour publier le site, il suffit de choisir le mode de configuration à mettre en place.

Lire >>

[System.Threading.ThreadAbortException]

 01/01/2019 |   Admin |  C#


Erreur :

[System.Threading.ThreadAbortException] = {Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.}

Thread was being aborted.

System.Runtime.Serialization.SafeSerializationManager

Solution :

SI vous utilisez : 

Response.Redirect("YourUrl");

Remplacez cette expression par : 

Response.Redirect("YourUrl", false);

Explication :

false permet de préciser que l'exécution de la page actuelle doit s'arretter.

Lire >>

Modifier les valeurs d'un fichier app.config d'une autre application avec XML

 01/01/2019 |   Admin |  C#


A utiliser SEULEMENT pour ce cas, sinon utiliser les méthodes habituelles avec configuration manager.
private static string UpdateValueAppConfig(string node, string newValue, string path)
{
try
{
var element = XElement.Load(path + "/app.config");
element.XPathSelectElement("//add[@key='" + node + "']").Attribute("value").Value = newValue;
element.Save(path + "/app.config");
}
catch (Exception ex)
{
        return "<p style=\"color:red\">Error to change app.config with this value " + newValue + ", this node " + node + " and this path " + path + "<br/> " + ex.Message + "</p>";
}
}

Lire >>