Convention ISO Pays web

 01/01/2019 |   Admin |  ASP MVC


Nom officiel - Code Identifier Langue correspondante
af 0x0036 Afrikaans
af-ZA 0x0436 Afrikaans - South Africa
sq 0x001C Albanian
sq-AL 0x041C Albanian - Albania
ar 0x0001 Arabic
ar-DZ 0x1401 Arabic - Algeria
ar-BH 0x3C01 Arabic - Bahrain
ar-EG 0x0C01 Arabic - Egypt
ar-IQ 0x0801 Arabic - Iraq
ar-JO 0x2C01 Arabic - Jordan
ar-KW 0x3401 Arabic - Kuwait
ar-LB 0x3001 Arabic - Lebanon
ar-LY 0x1001 Arabic - Libya
ar-MA 0x1801 Arabic - Morocco
ar-OM 0x2001 Arabic - Oman
ar-QA 0x4001 Arabic - Qatar
ar-SA 0x0401 Arabic - Saudi Arabia
ar-SY 0x2801 Arabic - Syria
ar-TN 0x1C01 Arabic - Tunisia
ar-AE 0x3801 Arabic - United Arab Emirates
ar-YE 0x2401 Arabic - Yemen
hy 0x002B Armenian
hy-AM 0x042B Armenian - Armenia
az 0x002C Azeri
Cy-az-AZ 0x082C Azeri (Cyrillic) - Azerbaijan
Lt-az-AZ 0x042C Azeri (Latin) - Azerbaijan
eu 0x002D Basque
eu-ES 0x042D Basque - Basque
be 0x0023 Belarusian
be-BY 0x0423 Belarusian - Belarus
bg 0x0002 Bulgarian
bg-BG 0x0402 Bulgarian - Bulgaria
ca 0x0003 Catalan
ca-ES 0x0403 Catalan - Catalan
zh-HK 0x0C04 Chinese - Hong Kong SAR
zh-MO 0x1404 Chinese - Macau SAR
zh-CN 0x0804 Chinese - China
zh-CHS 0x0004 Chinese (Simplified)
zh-SG 0x1004 Chinese - Singapore
zh-TW 0x0404 Chinese - Taiwan
zh-CHT 0x7C04 Chinese (Traditional)
hr
...

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 >>