Copier coller un répertoire en C# (Copy-Paste folder)

 27/05/2015 |   Admin |  C#


Copier le contenu d'un répertoire en utilisant la récursivité :

private static void CopyAll(DirectoryInfo source, DirectoryInfo target)
{
   // Check if the target directory exists, if not, create it.
   if (Directory.Exists(target.FullName) == false)
   {
       Directory.CreateDirectory(target.FullName);
   }
   // Copy each file into the new directory.
   foreach (FileInfo fi in source.GetFiles())
   {
fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);
   }
   // Copy each subdirectory using recursion.
   foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
   {
       DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name);
       CopyAll(diSourceSubDir, nextTargetSubDir);
   }
}

Lire >>

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

 27/05/2015 |   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 >>

[System.Threading.ThreadAbortException]

 27/05/2015 |   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 >>

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

 27/05/2015 |   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 >>

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

 27/05/2015 |   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 Twitterizer en .Net - Tutorial

 27/05/2015 |   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 >>

Utiliser le cache de type DONUT avec asp.net mvc4

 27/05/2015 |   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 >>

Convertir des pages HTML en PDF en .Net

 27/05/2015 |   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 >>