Jun 28

Activer les roles dans le web.config (System.Web) :

<authentication mode="Windows" /> 

<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider" />

Ajouter les références suivantes :

using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;

1) Récupérer le login de l'utilisateur :

public static string GetUserName()
{
	return HttpContext.Current.User.Identity.Name;
}

2) Récupérer le prénom de l'utilisateur :

public static string GetFirstName()
{
	string principal = GetUserName();
	PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
	UserPrincipal user = UserPrincipal.FindByIdentity(ctx,principal);
	return user.GivenName;
}

A partir de cette méthode, tout est récupérable, il suffit de changer le GivenName par la propriété correspondante.

3) Tester un droit pour l'utilisateur connecté :

Après avoir ajouté cette chaine dans le web.config :

<appSettings>
	……
	<add key="admin" value="Domaine\Droit"/>
</appSettings> 

public static bool UserIsAdmin()
{
	return Roles.IsUserInRole(ConfigurationManager.AppSettings["admin"]);
}
Jun 09

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.

Tags:
Feb 23

Quelques conseils pour améliorer le référencement de votre site ASP.NET, d'autres points seront bientot abordés.

1) Le choix du nom de domaine

2) Le nom des liens passés dans l'url est très important, l'url rewriting doit être utilisé

3) Préférer les "<div>" aux "<table>", surtout pas de "<table>" dans un autre "<table>"

4) Avoir un site validé par le W3C : utiliser cet outil : http://validator.w3.org/

5) Pour les images, renseigner l'attribut "alt"

6) Puur les liens de type "href" utiliser l'attribut "title"

7) Eviter les introductions et les menus de type Silverlight ou Flash

8) Utiliser les balises "<h1>" à "<h6>" en fonction de l'importance des mots clés

9) Faire venir les utilisateurs par d'autres sites

10) Ne pas utiliser la balise "<style>" au sein des pages, préférer les feuilles de styles externes CSS

11) Idem pour les javascript, préférer les fichiers .js

12) Limiter, voir éviter les commentaires dans les pages aspx 

13) Ne pas utiliser le ViewState si il n'est pas neccessaire

14) Ne pas utiliser <form runat=server"> si il n'est pas necessaire

15) Utiliser un siteMap.xml compatible avec les moteurs de recherche : http://sitemaps.org/fr/

16) Utiliser des titres de pages simple avec les mots clés correspondant au contenu de la page

17) Changer les titres des pages dynamiquement en fonction du contenu :

      HtmlTitle title = new HtmlTitle();

      title.Text = "Votre titre";

18) Vous pouvez ausse changer les balises meta dynamiquement, mais la plupart des moteurs de recherche ne les utilisent plus

19) Changer le contenu du site régulièrement

Oct 29

A) Le service

1) Ouvrir Visual Studio et créer un nouveau projet : Application du service WCF et nommer le projet UsersServices.

2) Supprimer les fichiers IService1.cs et Service1.svc

3)  Créer une simple base de données. Clique droit sur le dossier App_Data et ajouter un nouvel élément.

Sélectionner Base de données SQL Server et la nommer DataBase.mdf. Ouvrir la table en double cliquant dessus. Puis aller dans l’explorateur de serveurs pour y ajouter une table. Clique droit sur tables, ajouter une nouvelle table avec les champs suivant :

-          Id de type int, non null et IsIdentity (auto Incrémenté)

-          Nom de type varchar(50)

-          Prénom de type varchar(50)

Enregistrer cette table sous le nom Users.

4) Ajouter un WCF service à l’application. Clique droit sur le projet, ajouter un nouvel élément, Service WCF puis le nommer UsersService. Plusieurs fichiers ont étés créés.

5)  Ajouter la chaine de connexion au fichier web.config. L’ouvrir puis ajouter cette ligne dans la balise ConnectionStrings:

<connectionStrings>

 <add name="UsersConnectionString"

connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DataBase.mdf; Integrated Security=True;User Instance=True"

providerName="System.Data.SqlClient"/>

</connectionStrings>

6) Ouvrir le fichier IUsersService.cs et ajouter un Contrat de données

using System;

using System.Collections.Generic;

using System.Linq;

using System.Runtime.Serialization;

using System.ServiceModel;

using System.Text;;

namespace UsersServices

{

    [DataContract]

    public class User

    {

        [DataMember]

        public int UserId { get; set; }

 

        [DataMember]

        public string UserName { get; set; }

 

        [DataMember]

        public string UserFirstName { get; set; }

    }

}

7) Ajouter l’interface de la classe User

[ServiceContract]

    public interface IUsersService

    {

        [OperationContract]

        User GetUser(int userId);

 

        [OperationContract]

        void SaveUser(User user);

    }

 

IUsersService.cs doit ressembler à ceci :

using System;

using System.Collections.Generic;

using System.Linq;

using System.Runtime.Serialization;

using System.ServiceModel;

using System.Text;

namespace UsersServices

{

    [DataContract]

    public class User

    {

        [DataMember]

        public int UserId { get; set; }

 

        [DataMember]

        public string UserName { get; set; }

 

        [DataMember]

        public string UserFirstName { get; set; }

    }

 

    [ServiceContract]

    public interface IUsersService

    {

        [OperationContract]

        User GetUser(int userId);

 

        [OperationContract]

        void SaveUser(User user);

    }

}

8) Ouvrir le fichier UsersService.svc et rajouter les using suivants :

-          System.Data

-          System.Data.SqlClient

-          System.Configuration

Ajouter le code permettant d’établir la connexion à la base et implémenter les méthodes GetUser et SaveUser. (Pour avoir le squelette des méthodes, Clique droit sur IUsersService puis sur implémenter l’interface dans :  public class UsersService : IUsersService

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Runtime.Serialization;

using System.ServiceModel;

using System.Text;

using System.Data;

using System.Data.SqlClient;

using System.Configuration;

 

namespace UsersServices

{

    public class UsersService : IUsersService

    {

        private string _connectionString = ConfigurationManager.ConnectionStrings["UsersConnectionString"].ToString();

 

        public User GetUser(int userId)

        {

            string strSql = "SELECT Id, Nom, Prenom FROM users WHERE (Id=@userId)";

 

            SqlConnection connect = new SqlConnection(_connectionString);

            SqlCommand cmd = new SqlCommand(strSql, connect);

            cmd.Parameters.Add("userId",SqlDbType.Int,0).Value = userId;;

 

            SqlDataAdapter sda = new SqlDataAdapter(cmd);

            DataSet ds = new DataSet();

            sda.Fill(ds);

 

            User _user = new User();

            _user.UserId = userId;

            _user.UserName = ds.Tables[0].Rows[0]["Nom"].ToString();

            _user.UserFirstName = ds.Tables[0].Rows[0]["Prenom"].ToString();

 

            return _user;

        }

 

        public void SaveUser(User user)

        {

            string strSql = "INSERT INTO users (Nom,Prenom) VALUES (@nom,@prenom)";

 

            SqlConnection connect = new SqlConnection(_connectionString);

            SqlCommand cmd = new SqlCommand(strSql, connect);

            cmd.Parameters.Add("nom", SqlDbType.VarChar,50).Value = user.UserName;

            cmd.Parameters.Add("prenom", SqlDbType.VarChar, 50).Value =

user.UserFirstName;

 

            connect.Open();

            cmd.ExecuteNonQuery();

            connect.Close();

        }

    }

}

9) Compiler le Service, vérifier qu’il n’y a pas d’erreur puis lancer l’application pour voir ses détails.

B) Le consommateur du service

1) Ajouter un nouveau site web à la solution. Clique droit sur la solution, ajouter, nouveau site web. Puis le nommer UsersClient. Faire un clique droit sur le site et définir comme projet de démarrage.

2) Ajouter la référence au service WCF. Clique droit sur le site, ajouter une référence de service puis Découvrir. Renseigner comme Espace de noms : UsersService.

3) Ouvrir la page default.aspx et ajouter les contrôles nécessaires à l’exécution, pour obtenir une page de ce style :

Code de la page default.aspx :

<table>

<tr>

<td colspan="3" align="center">Recherche d'un User</td>

</tr>

<tr>

<td>ID :</td>

<td>

<asp:TextBox runat="server" ID="txtSearchId"></asp:TextBox>

</td>

<td>                   

<asp:Button runat="server" ID="btnSearch" Text="Rechercher" OnClick="btnSearch_Click" />

</td>

</tr>

<tr>

<td colspan="3"><hr /> </td>

</tr>

<tr>

<td>Nom :</td>

<td>

                    <asp:TextBox runat="server" ID="txtSearchNom"></asp:TextBox>

</td>

            </tr>

<tr>

<td>Prénom :</td>

<td>

<asp:TextBox runat="server" ID="txtSearchPrenom"></asp:TextBox>

</td>

</tr>

<tr>

<td colspan="3" align="center">

<asp:Label runat="server" ID="lblMess" ForeColor="Green"></asp:Label>

</td>

</tr>

<tr>

<td colspan="3" align="center"> Ajout d'un User</td>

</tr>

<tr>

<td colspan="3"><hr /></td>

</tr>

<tr>

<td>Nom :</td>

<td>

<asp:TextBox runat="server" ID="txtNom"></asp:TextBox>

</td>

            </tr>

<tr>

<td>Prénom :</td>

<td>

<asp:TextBox runat="server" ID="txtPrenom"></asp:TextBox>

</td>

</tr>

<tr>

<td colspan="3" align="center">

<asp:Button runat="server" ID="btnAdd" Text="Ajouter"

OnClick="btnAdd_Click" />

</td>

</tr>

</table>


Code Behind :

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

 

public partial class _Default : System.Web.UI.Page

{

    protected void btnSearch_Click(object sender, EventArgs e)

    {

        try

        {

            int userId = int.Parse(txtSearchId.Text);

            UsersService.UsersServiceClient _usersService =

new UsersService.UsersServiceClient();

 

            UsersService.User _user = new UsersService.User();

            _user = _usersService.GetUser(userId);

 

            txtSearchNom.Text = _user.UserName;

            txtSearchPrenom.Text = _user.UserFirstName;

            lblMess.Text = string.Empty;

        }

        catch (NullReferenceException)

        {

            lblMess.Text = "Aucun User ne correspond avotre recherche";

        }

    }

 

    protected void btnAdd_Click(object sender, EventArgs e)

    {

        try

        {

            UsersService.UsersServiceClient _usersService = new UsersService.UsersServiceClient();

            UsersService.User _user = new UsersService.User();

 

            _user.UserName = txtNom.Text;

            _user.UserFirstName = txtPrenom.Text;

 

            _usersService.SaveUser(_user);

 

            txtNom.Text = string.Empty;

            txtPrenom.Text = string.Empty;

            lblMess.Text = "User ajouté avec succès";

        }

        catch (Exception ex)

        {

            lblMess.Text = ex.Message;

        }

    }

}

4) Lancer l’application en ajoutant dans un premier temps un User (la base étant vide), dans le panel du bas.

5) Vous pouvez ensuite faire une recherche par l'identifiant.

Il s'agit d'un exemple simplifié pour comprendre le fonctionnement de WCF, il faudra donc rajouter beaucoup de contrôles et de méthodes pour avoir une application fiable. 

Tags:
Oct 08

Exemple simple de l'utilisation de xml et xslt :

Fichier XML : 

<?xml version="1.0" encoding="iso-8859-1"?>

<personnes>

  <personne>

    <name>Toto</name>

    <age>15</age>

    <city>Paris</city>

  </personne>

  <personne>

    <name>Dupont</name>

    <age>59</age>

    <city>Rennes</city>

  </personne>

  <personne>

    <name>Durand</name>

    <age>46</age>

    <city>Toulouse</city>

  </personne>

  <personne>

    <name>Martin</name>

    <age>35</age>

    <city>Lyon</city>

  </personne>

</personnes>

Fichier XSLT :

 

<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">

    <html>

      <body>

        <h2>Personnes</h2>

        <table border="1">

          <tr bgcolor="#9acd32">

            <th>Name</th>

            <th>Age</th>

            <th>City</th>

          </tr>

          <xsl:for-each select="personnes/personne">

            <tr>

              <td bgcolor="yellow">

                <xsl:value-of select="name"/>

              </td>

              <td>

                <xsl:value-of select="age"/>

              </td>

              <td>

                <xsl:value-of select="city"/>

              </td>

            </tr>

          </xsl:for-each>

        </table>

      </body>

    </html>

  </xsl:template>

</xsl:stylesheet>

Page web :

<asp:Xml ID="Xml1" runat="server"></asp:Xml>

CodeBehind :

XmlDocument xmlDoc = new XmlDocument();

XslTransform xslT = new XslTransform();

xmlDoc.Load(Server.MapPath("XMLFile.xml"));

xslT.Load(Server.MapPath("XSLTFile.xslt"));

Xml1.Document = xmlDoc;

Xml1.Transform = xslT;

Tags:
Oct 06

Pour gérer les attributs OnMouseOver et OnMouseOut dans un contrôle ImageButton il suffit de faire comme dans cette exemple :

<asp:ImageButton runat="server"

ImageUrl="Images/croix.png"                

Width="25px"

OnMouseOver="this.src ='Images/croix-red.png'"

OnMouseOut="this.src ='Images/croix.png'" />

 

 

Tags:
Oct 06

La TextBox multiligne :

<asp:TextBox runat="server"

       ID="txtMulti"

       Width="100%"

       Rows="7"

       TextMode="MultiLine"

       Style="resize: none;"

       OnKeyPress="CaracMax(this, 10)"

       MaxLength="10" />

La fonction JavaScript :

function CaracMax(texte, max) {

    if (texte.value.length >= max) {

        texte.value = texte.value.substr(0, max - 1);

    }

}

Tags:
Oct 06

Pour empêcher de pouvoir redimensionner une textBox de type multiligne sous le navigateur chrome, il suffit tout simplement de rajouter l'attribut suivant : Style="resize: none;"

Ce qui donne : 

<asp:TextBox runat="server"

 ID="txtMulti"

 Width="100%"

 Rows="5"

 TextMode="MultiLine"

             Style="resize: none;" />

 

Si vous avez plusieurs TextBox de ce type sur votre site, vous pouvez rajouter ceci à votre css : 

<style type="text/css"> 

textarea{resize:none;} 

</style> 

Tags:
Sep 03

Au lieu d'avoir les pages d'erreurs par défaut, souvent désagréable à voir par le client, asp.net permet en quelques cliques de personnaliser ces pages.

1) Décommenter la section "customErrors" dans le web.config

et y modifier le nom des fichiers, on peut y placer aussi bien des pages html que des pages aspx.

<customErrors mode="On" defaultRedirect="GenericErrorPage.aspx">

<error statusCode="403" redirect="403.aspx" />

<error statusCode="404" redirect="404.aspx" />

</customErrors>

L'attribut "mode" peut prendre 3 valeurs :

On : La gestion des erreurs est activée en local et à distance.

Off : Gestion d'erreurs désactivée.

RemoteOnly : Gestion des erreurs activée seulement à distance, en local se seront les pages par défaut.

2) Créer les pages

Ensuite il faut créer ces pages, soit de façon très simple en mettant une image et le nom de l'erreur ou alors en affichant un message dynamique (voir 3)

3) Personnaliser ses pages d'erreurs

a) Créer une classe "BasePage" qui va hériter de "System.Web.UI.Page"

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Configuration;

 

/// <summary>

/// Description résumée de BasePage

/// </summary>

public class BasePage : System.Web.UI.Page

{

      public BasePage()

{

}

 

protected override void OnError(EventArgs e)

{

Exception ex = Server.GetLastError();

Session["LastError"] = ex.Message;

Response.Redirect("~/GenericErrorPage.aspx");

}

}

b) Faire hériter les pages utilisant cette gestion d'erreur par "BasePage" et non plus par "System.Web.UI.Page"

 

c) Commenter ou supprimer le corps de la méthode Application_Error dans le Global.asax

 

d) Modifier la page d'erreur générique :

 

protected void Page_Load(object sender, EventArgs e)

{

if (Session["LastError"] != null)

{

lblMessage.Text = Session["LastError"].ToString();

}

}

 

e) Voici à quoi peut ressembler votre page désormais :

 

 

f) Type de message

Le message peut-être plus ou moins développé en fonction du type de visiteurs (Si c'est un site grand public, on évitera de décrire l'erreur avec toute la stackTrace par exemple!)

Tags:
Sep 03

"L'URL-rewriting est une réécriture d'URL. La technique consistant à réécrire sous forme plus simple des URLs complexes. Cette technique est transparente pour l'internaute ainsi que pour les moteurs de recherches. Le but principal est d'obtenir un meilleur référencement."  cf kdj-webdesign.com

Le but de ce tutoriel est de transformer de façon transparente pour l'utilisateur ce genre d'url : 

Au lieu d'avoir ce type d'adresse : http://www.lesite.com/product.aspx?id=1&name?leNomDeMonProduit

on préférera la transformer en :  http://www.lesite.com/leNomDeMonProduit.html

A. Première technique

1) Ajouter la DLL nécessaire dans le répertoire Bin de votre site web

ThunderMain.URLRewriter.dll (4,50 kb) ou sur le site du projet "code source" : http://www.codeproject.com/aspnet/URLRewriter.asp

Clique droit sur le site, puis ajouter une référence pointant sur cette DLL.

2) Ajouter ou modifier le fichier Global.asax

Y ajouter cette méthode : 

void Application_BeginRequest(object sender, EventArgs e)

{

ThunderMain.URLRewriter.Rewriter.Process();

}

 

3) Modifier le fichier Web.config

a) Ajouter dans la section "configuration" :

 

<sectionGroup name="system.web">

<section name="urlrewrites"  

type="ThunderMain.URLRewriter.Rewriter,&#xA; ThunderMain.URLRewriter, Version=1.0.783.30976,&#xA; Culture=neutral, PublicKeyToken=7a95f6f4820c8dc3"/>

</sectionGroup>

b) Ajouter dans la section "System.Web" :

<urlrewrites>

<rule>

<url>product_1.html</url>

            <rewrite>product.aspx?id=1</rewrite>

      </rule>

      <rule>

            <url>product_2.html</url>

            <rewrite>article.aspx?id=2</rewrite>

      </rule>

</urlrewrites>

On peut ajouter autant de balises "rule" que l'on désire. On peut également utiliser des patterns comme <url>product_(.*).html</url> etc...

 

Si cette technique ne marche pas, il se peut que votre serveur web n'interprète pas les pages html comme des pages dynamiques. Il faudra donc modifier la configuration de celui-ci.

 

B. Deuxième technique

Télécharger la dll à cette adresse : http://urlrewriter.net/

Modifier le web.config comme cela :

Ajouter la section :

<section name="rewriter"

requirePermission="false"                

type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />


Dans le HttpModule :

<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>

 

Après la le </system.web> :

<rewriter>

    <rewrite url="~/([0-9]+)-(.+).html" to="~/Default.aspx?id=$1&amp;titre=$2" />

  </rewriter>