none
Partial Class non pris en compte par IIS 7 RRS feed

  • Question

  • Bonjour,

    Actuellement en pleine intégration d'un projet ASPX/C# sur un serveur IIS 7 sous Windows 2008 R2, je rencontre un problème plutôt ennuyeux qui empêche le logiciel de fonctionner correctement.

    Mon projet est une application Web composé de divers fichiers ".cs" contenant une classe partielle. Tout fonctionne comme voulu sur mon poste bureautique avec Visual Studio 2012, mais lorsque je copie les fichiers sur le serveur IIS l'application réagis de manière non souhaité. 

    Il me semble que les classes partielles sont réunis lors de la compilation pour faire une seule classe regroupant les divers fonctions codés sur les différents fichiers. Les variables pouvant être utilisé d'un fichier à l'autre (pour les variables globales.).

    Cependant le serveur IIS semble compiler les pages de manière séparé et ne reconnait donc pas certain appel de variable comme ci-dessous :

    Sachant que la variable "con" sert de variable de connexion à MySQL et qu'elle est reprise pour les différentes requêtes à effectuer. 

    Fichier authkeys.aspx.cs :

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Reflection;
    using System.Runtime.InteropServices;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using MySql.Data.MySqlClient;
    using System.Net.Mail;
    using System.Text;
    using AE.Net.Mail.Imap;
    using AE.Net.Mail;
    
    
    
    namespace WebApplication1
    {
        public partial class Ticketing : System.Web.UI.Page
        {
            // Mise en place des informations de connexion SQL et ENODIOS
            MySqlConnection con = new MySqlConnection();
    
            ImapClient imap = new ImapClient("10.40.0.7", "banett", "ttenab");
     
            string connectionString = @"Data Source=127.0.0.1; Database=ticketing; User ID=root; Password=''";
    
            protected void Page_Load(object sender, EventArgs e)
            {
                // Ouverture d'une connexion SQL
                ConnexionSQL();
    
                ConnexionSMTP("U133405", "Cz77n91pa");
            }
    
            private void ConnexionSQL()
            {
                /* Fonction d'ouverture de la connexion SQL */
    
                // Association des identifiants de connexion à la variable de gestion des connexions
                con.ConnectionString = connectionString;
    
                try
                {
                    con.Open();
                }
                catch (System.Exception ex)
                {
                    // Problème lors de l'ouverture de la connexion. Affichage exception
                    string Result_Connexion;
                    Result_Connexion = ex.Message;
                };
            }
            
            protected void Connect_Auth(object sender, EventArgs e)
            {
                /* Fonction de redirection et de connection à mysql et imap */
    
                Response.Redirect("accueil-user.aspx");    
            }
    
            protected void ConnexionSMTP(string login, string mdp)
            { 
                /* Fonction de connexion mail par SMTP */
    
                // On spécifie le serveur SMTP et le port
                SmtpClient SmtpServer = new SmtpClient("mail-0092.sfr.com");
                SmtpServer.Port = 25;
    
                // On spécifie les informations de compte
                SmtpServer.Credentials = new System.Net.NetworkCredential("U133405", "Cz77n91pa");
    
            }
        }
    }

    fichier accueil-user.aspx.cs :

    using MySql.Data.MySqlClient;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace WebApplication1
    {
        public partial class Ticketing : System.Web.UI.Page
        {
            protected void AfficherUser()
            {
                /* Fonction d'affichage des utilisateurs */
    
                // Déclaration des variables
                MySqlCommand cmd = new MySqlCommand("SELECT Nom, Prenom, Mail_Utilisateur, Nom_Profil, UserId FROM utilisateur NATURAL JOIN profil ORDER BY Nom", con);
    
                // On effectue la recherche pour trouver les utilisateurs
                using (MySqlDataReader request_lecture = cmd.ExecuteReader())
                {
                    // Tant que l'on a du contenu on l'affiche 
                    while (request_lecture.Read())
                    {
                        Response.Write("<tr><td><a href=\"modifier-user.aspx?or="+request_lecture.GetString(4)+"\">" + request_lecture.GetString(4) + "</a></td>");                        // Affiche UserID
                        Response.Write("<td>" + request_lecture.GetString(0) + "</td>");                            // Affiche les noms
                        Response.Write("<td>" + request_lecture.GetString(1) + "</td>");                            // Affiche les prenoms
                        Response.Write("<td>" + request_lecture.GetString(2) + "</td>");                            // Affiche les mails
                        Response.Write("<td>" + request_lecture.GetString(3) + "</td></tr>");                       // Affiche les types de profils (commercial ou tech)
                    }
                }
            }
    
            protected void RedirectAjouterUser(object sender, EventArgs e)
            {
                /* Fonction de redirection de l'ajout d'utilisateur */
                Response.Redirect("ajouter-user.aspx");
            }
    
            protected void RedirectSupprimerUserAc(object sender, EventArgs e)
            {
                /* Fonction de redirection de la suppression d'utilisateur */
                Response.Redirect("supprimer-user.aspx");
            }
        }
    }

    Fichier accueil-user.aspx

    <%@ Page Title="" Language="C#" AutoEventWireup="true" CodeBehind="accueil-user.aspx.cs" Inherits="WebApplication1.Ticketing" %>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head id="Head1" runat="server">
            <link href="StyleTicketing.css" rel="stylesheet" type="text/css" />
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
                <title></title>
        </head>
        <body>
            <!-- Titre de la page -->
            <h1> Accueil Utilisateur </h1>
            <h2> Liste Utilisateur </h2>
    
        <!-- On crée le tableau pour la mise en page de la liste -->
        <table id="Table_User" style="border:solid; border-collapse:collapse; text-align:center"> 
            <tr>
                <td> UserID </td>
                <td> Nom des utilisateurs </td>
                <td> Prenom des utilisateurs </td>
                <td> Mail des utilisateurs </td>
                <td> Profil </td>
            </tr>
            <% AfficherUser(); %>
        </table>
        <br />
        
        </body>
        </html>
    

    Ce code fonctionnant sur mon poste je doute que cela vienne du codage mais plus d'un paramètre qui m'échappe sur le serveur IIS. J'ai bien effectué la création d'une application Web dans le gestionnaire du serveur car j'ai pu lire en cherchant une solution que la compilation était différente. 

    Je suis à cours d'idée et je dois dire que ca commence à être frustrant après 1 semaine et demi de recherche sans avancer. Si vous pouviez m'éclairer j'en serai ravi !

    Cdt,

    Elmund

    mercredi 6 mai 2015 12:16

Réponses

  • Bonjour,

    Avant de commencer, il est nécessaire de vérifier que la base de données soit accessible depuis le serveur.

    Je pense que c'est une erreur d'avoir renommer la classe partielle des pages aspx en Ticketing

    Il suffit de créer la chaîne de connexion dans la fichier web.config en utilisant un pilote adapté:

    <connectionStrings>
      <add name="DefaultConnection" connectionString="DRIVER={MySQL ODBC 3.51 Driver};Database=YourDatabase;Server=localhost;UID=YourUsername;PWD=YourPassword;"/>
    </connectionStrings>


    Avec la classe "ApplicationDbContext", il faut vérifier la chaîne de connexion:       

            public ApplicationDbContext()
                : base("DefaultConnection", throwIfV1Schema: false)

    Dans le fichier Accueil.aspx,

      <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server" SelectMethod="GridView1_GetData"></asp:GridView>
        </div>
        </form>

    Dans le fichier Accueil.aspx.cs,

    public partial class Accueil : System.Web.UI.Page { private ApplicationDbContext _dataContext = null;
    protected void Page_Load(object sender, EventArgs e) { _dataContext = new ApplicationDbContext(); } public IQueryable GridView1_GetData() { return _dataContext.Users; } }

    Aussi, nous pouvons faire une classe Document.cs qui est hérite de System.Web.UI.Page

            private ApplicationDbContext _dataContext = null;
    
            public ApplicationDbContext DataContext
            {
                get
                {
                    if(_dataContext == null)
                    {
                        _dataContext = new ApplicationDbContext();
                    }
                    return _dataContext;
                }
                
            }

    Dès lors, je peux créer une page aspx qui hérite directement de Document. Je peux utiliser la propriété directement DataContext. L'exemple est le fichier "Accueil1.aspx.cs":

        public partial class Accueil1 : WebApplication2.Core.Document
        {
            protected void Page_Load(object sender, EventArgs e)
            {
    
            }
    
            public IQueryable GridView1_GetData()
            {
                return this.DataContext.Users;
            }
        }

    Ceci n'est qu'une version simplifiée.

    Bonne journée.



    jeudi 7 mai 2015 12:25
  • Après quelques tests de votre solution olivier254, j'ai repris le même procédé que vous avez proposé et cela semble bien fonctionner. 

    J'ai crée un fichier source c# pour la connexion de la base de donnée ainsi que d'autres connexions comme le SMTP, et mon IMAP qui hérite de "System.Web.UI.Page". Suite de quoi tous mes autres fichiers de code hérite de mon nouveau fichier source et se servent des différentes fonctions de connexion pour effectuer les requêtes.

    Merci de votre aide !

    Elmund



    mardi 12 mai 2015 07:51

Toutes les réponses

  • Bonjour,

    Avant de commencer, il est nécessaire de vérifier que la base de données soit accessible depuis le serveur.

    Je pense que c'est une erreur d'avoir renommer la classe partielle des pages aspx en Ticketing

    Il suffit de créer la chaîne de connexion dans la fichier web.config en utilisant un pilote adapté:

    <connectionStrings>
      <add name="DefaultConnection" connectionString="DRIVER={MySQL ODBC 3.51 Driver};Database=YourDatabase;Server=localhost;UID=YourUsername;PWD=YourPassword;"/>
    </connectionStrings>


    Avec la classe "ApplicationDbContext", il faut vérifier la chaîne de connexion:       

            public ApplicationDbContext()
                : base("DefaultConnection", throwIfV1Schema: false)

    Dans le fichier Accueil.aspx,

      <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server" SelectMethod="GridView1_GetData"></asp:GridView>
        </div>
        </form>

    Dans le fichier Accueil.aspx.cs,

    public partial class Accueil : System.Web.UI.Page { private ApplicationDbContext _dataContext = null;
    protected void Page_Load(object sender, EventArgs e) { _dataContext = new ApplicationDbContext(); } public IQueryable GridView1_GetData() { return _dataContext.Users; } }

    Aussi, nous pouvons faire une classe Document.cs qui est hérite de System.Web.UI.Page

            private ApplicationDbContext _dataContext = null;
    
            public ApplicationDbContext DataContext
            {
                get
                {
                    if(_dataContext == null)
                    {
                        _dataContext = new ApplicationDbContext();
                    }
                    return _dataContext;
                }
                
            }

    Dès lors, je peux créer une page aspx qui hérite directement de Document. Je peux utiliser la propriété directement DataContext. L'exemple est le fichier "Accueil1.aspx.cs":

        public partial class Accueil1 : WebApplication2.Core.Document
        {
            protected void Page_Load(object sender, EventArgs e)
            {
    
            }
    
            public IQueryable GridView1_GetData()
            {
                return this.DataContext.Users;
            }
        }

    Ceci n'est qu'une version simplifiée.

    Bonne journée.



    jeudi 7 mai 2015 12:25
  • Après quelques tests de votre solution olivier254, j'ai repris le même procédé que vous avez proposé et cela semble bien fonctionner. 

    J'ai crée un fichier source c# pour la connexion de la base de donnée ainsi que d'autres connexions comme le SMTP, et mon IMAP qui hérite de "System.Web.UI.Page". Suite de quoi tous mes autres fichiers de code hérite de mon nouveau fichier source et se servent des différentes fonctions de connexion pour effectuer les requêtes.

    Merci de votre aide !

    Elmund



    mardi 12 mai 2015 07:51