IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

Intraweb : ISAPI ou STANDALONE


Sujet :

Web & réseau Delphi

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 22
    Par défaut Intraweb : ISAPI ou STANDALONE
    Bonjour,

    J'ai developpé une application Intraweb version 8 en mode StandAlone (executable).
    L'application n'est pas très stable lorsqu'il y a plusieures connexions simultanées.
    Je voudrais la transformer en ISAPI (dll) et y accéder à partir d'un serveur APACHE.
    Pensez-vous que cela peut améliorer la stabilité de l'application?

    Je voudrais partager mon expérience d'Intraweb pour l'améliorer.

    Merci

  2. #2
    Membre extrêmement actif
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 219
    Par défaut
    bonsoir,

    je ne pense pas que le fait de mettre ton application en isapi la rende plus stable, le problème doit être ailleurs.
    Que ce passe-t-il exactement dans ton application ? tu as des messages d'erreur ? Peux-tu en dire un peu plus sur la nature de l'instabilité ?
    Perso j'utilise Intraweb parfois en isapi, parfois en standalone, je n'ai pas de problème de stabilité, même avec pas mal de connexions.

    @++
    Dany

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 22
    Par défaut
    L'instabilité se produit au bout de quelques connexions.
    En local, sur ma machine, je n'ai aucun problème.
    Mais en production, sur un serveur 2003, le module est bloqué.
    Impossible de se connecter. Il faut que j'arrête le module.

    J'ai peut-être un problème de mémoire : j'utilise des classes et avec Intraweb, il faut faire attention quand on libère une instance.
    Ce n'est pas comme sur une fenêtre ShowModal où on attend que la fenêtre soit fermé pour libérer l'instance.

    Par contre, je l'ai installé en tant que service. J'ai un petit programme qui teste tous les 5 minutes si le module répond. S'il ne répond pas, il le relance.

    Merci pour ton aide...

  4. #4
    Membre extrêmement actif
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 219
    Par défaut
    Bonjour,

    si tu soupçonne un problème de fuite mémoire, tu peux utiliser memcheck pour les dépister.

    Mais je pense que le problème doit être ailleurs. Lorsque tu test en local, tu test avec combien d'utilisateurs en simultané ? Parce que voilà une différence en général entre un test et une production. Plus tu as d'utilisateurs en simultanée, plus tu augmente les chances qu'ils fassent la même chose au même moment. Donc il faut veiller avec soin au éventuels objets ou variable que tu utiliserai en portée globale. Notamment si tu as une instance globale qui pourrait être détruite par une session alors qu'elle serait en cours d'utilisation par une autre. Que fais-tu par exemple à la fin d'une session ?

    Est-ce que cela plante toujours avec le même nombre d'utilisateurs ou pas ?

    @++
    Dany

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 22
    Par défaut
    Lorsque je fais des tests, je me connecte avec 3 ou 4 comptes simultanément.

    Par contre, j'ai peut-être un réel problème au niveau des sessions car je ne sais pas ce qu'il faut faire après la fin d'une session.
    En fait, je supposais qu'au bout d'un certain TimeOut, Intraweb fermait la session et la détruisait en même temps. Je ne me suis pas inquiété sur cette partie. Que faut-il faire après chaque session? Comment détruitre une session inutile? Tout simplement, comment savoir qu'une session n'est plus active?

    D'ailleurs, je voudrais savoir s'il est possible d'ouvrir une nouvelle session Intraweb en cliquant juste sur un bouton et non en ouvrant ma première page de connexion.
    Je m'explique : une fois le module ouvert, une session est automatiquement créee si je clique sur Execute (F9) alors que je n'ai pas demandé de session.
    J'ai donc des sessions qui sont créees à l'ouverture de ma page de démarrage (page de log) même si je ne me suis pas logué.

    Merci

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 22
    Par défaut
    J'oubliais : le nombre d'utilisateur est variable.
    J'ai l'impression que c'est au bout d'un certain temps d'utilisation qu'il plante (impossible d'accèder à la page de connexion).
    J'ai l'impression, comme tu dis, qu'il perd des variables en cours de route.
    Qu'est ce qui peut faire que les variables se mêlent entre eux?

    Je suis à ton écoute car je commence à trouver Intraweb inadapté à ce genre de développement (gestion commerciale)

  7. #7
    Membre extrêmement actif
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 219
    Par défaut
    Alors je te rassure sur un point, Intraweb est tout à fait adapté à ce type d'application, puisque d'ailleurs Intraweb est plus dédié web applicatif que web de publication.

    Concernant les sessions, effectivement Intraweb les tuent au bout d'un laps de temps (paramétrable dans le servercontroller). Et malheureusement, à moins de faire une application en mode page, c'est à dire sans session, il y a une session de créée dès lors que tu ouvre une page de ton application.
    Par contre concernant la page de login, est-il nécessaire de faire un formulaire intraweb pour cela ? Ne peux tu pas avoir une page statique html avec un formulaire dont le post dirigerait l'utilisateur vers ton application qui récupèrerait les données en paramètres et ferait la vérification des identifiants saisis : si ok on continue, sinon, tu fais un WebApplication.TerminateAndRedirect('url de ta page de login'); Ce qui tuera la session ouverte et renverra l'utilisateur sur ta page de login.

    Enfin, en fin de session Intraweb détruit les objets contenus dans le TIWUserSession, plus éventuellements d'autres objets si tu les précise dans l'envent OnCloseSession du servercontroller.

    Le fait que le plantage s'effectue plutôt au bout d'un certain temps qu'à partir d'un certain nombre de connexions simultanées me fait pencher vers la fin de session. Regarde bien ce que tu utilise dans ta session, et si tu veux éviter tout problème, bannit les objets de portée globale, à moins de le faire en connaissance de cause et de les gérés en tant que tel.

    Je suis en train de préparer un petit tuto sur la gestion des sessions avec Intraweb, mais à la vitesse où j'avance je doute qu'il arrive à point pour t'aider, du moins j'espère que tu auras résolu ton problème avant
    En tout cas n'hésite pas je serais quand même sur le forum pour essayer de t'aider

    @++
    Dany

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 22
    Par défaut
    Je voudrais avoir une précision stp : que veux-tu dire par "objets de portée globale"

    Je crée mes variables au niveau de TUserSession = class(TComponent)

    Merci pour tes explications...

  9. #9
    Membre extrêmement actif
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 219
    Par défaut
    J'entends par là des objets accessible par toute les sessions. Ta classe TUserSession = class(TComponent) est une classe que tu as créé ? Où l'instancie-tu ?, où la supprimes-tu ?
    A moins que tu parle plutôt de TIWUserSession = class(TIWUserSessionBase) qui est la classe représentant la session Intraweb et dont il existe une instance pour chaque session utilisateur active. Et c'est bien dans cette classe que tu dois mettre tes objets. Et donc il ne doivent être accessible (et accédés) que de la session.

    Autre piste : poeux tu interroger tes utilisateurs au moment d'un plantage pour voir si l'un d'entre eux a un message d'erreur (le vilain écran atozed). Ca pourrait être un point de départ pour trouver le problème.

    @++
    Dany

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 22
    Par défaut
    Je vais vérifier demain si c'est bien dans TIWUserSession = class(TIWUserSessionBase) que je crée mes variables globales.
    Je me suis peut-être mélangé avec ces sessions.

    Par contre, j'ai bien le joli message d'erreur d'Atozed : mais "j'intercepte" ce message pour afficher une page d'erreur en html du genre "un problème est survenu..." .

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 22
    Par défaut
    Je reviens sur le problème de mémoire.
    Je me suis aperçu que je ne libérais pas totalement certaines instances.

    Quand je lance le module Intraweb, dans le gestionnaire des tâches, il est en util.mémoire à 14 Mo. Il atteint facilement 50 Mo.
    Je pense que c'est pas bien normal.

    Qu'en penses-tu?

  12. #12
    Membre extrêmement actif
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 219
    Par défaut
    Citation Envoyé par ibrahim26 Voir le message
    Je vais vérifier demain si c'est bien dans TIWUserSession = class(TIWUserSessionBase) que je crée mes variables globales.
    Je me suis peut-être mélangé avec ces sessions.
    Ok, donc tu as des variables globales, c'est à dire accessible par toute les sessions ? De qu'elle nature sont ces varialbes ? Tu n'aurais pas des variables d'instance qui pourraient être libérées à un moment par une session la rendant du coup invalide pour les autres.

    Citation Envoyé par ibrahim26 Voir le message
    Par contre, j'ai bien le joli message d'erreur d'Atozed : mais "j'intercepte" ce message pour afficher une page d'erreur en html du genre "un problème est survenu..." .
    Ah voilà un élément à étudier, que dis le message généré par intraweb ? Est-ce une violation d'accès ?

    Citation Envoyé par ibrahim26 Voir le message
    Quand je lance le module Intraweb, dans le gestionnaire des tâches, il est en util.mémoire à 14 Mo. Il atteint facilement 50 Mo.
    Je pense que c'est pas bien normal.

    Qu'en penses-tu?
    ce que dis le gestionnaire de tâche n'est pas trop précis. Si tu y monte trop rapidement alors oui il doit y avoir un problème.
    Pour être sûr de toi, utilise memcheck (tu trouveras des sources sur ce site concernant son utilisation) et lorsqu'il ne génèrera plus de rapport à la fin de ton application, tu pourras être sûr que tu es clean du côté mémoire.

    @++
    Dany

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 22
    Par défaut
    J'ai fait quelques modifications aux niveaux de mes sessions.
    J'avais en faîte une classe TIWUserSession = class(TComponent) et non TIWUserSession = class(TIWUserSessionBase).

    Mes variables globales sont de type entier, chaine et classe.
    Je détruis ces classes quand la session est détruite.

    Par contre, je m'aperçois que la taille en mémoire du module augemente petit à petit, au fur et à mesure des connexions. Et le module devient de plus en plus lent.

    J'ai pas de retour encore sur le message d'erreur Atozed.

    Quand j'ouvre Internet Explorer, une session est créee. Mais quand je le ferme, il n y a pas de CloseSession donc les objets ne sont pas détruits proprement (sauf au bout de 15 minutes = TimeOut). Y'a t-il un moyen de détruire proprement la session si on ferme IE sans cliquer sur un bouton Fermer par exemple? En fait comment savoir que l'utilisateur a quitté IE donc le module?

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 22
    Par défaut
    Sur IIS, quand une DLL est planté, il me semble que la DLL est relancée automatiquement.
    Existe-il un moyen avec Intraweb de savoir que le module est planté, et donc de le redémarrer automatiqument?

  15. #15
    Membre extrêmement actif
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 219
    Par défaut
    Bonjour,

    qu'entends-tu par variables globales donc ? Tu les détruits à la fin de la session ça ok mais si elles sont globales pour moi elles ne sont par spécifiques à la session. Donc une fois détruites ne sont elles pas accédées par d'autres sessions ? Ce qui pourrait expliquer le plantage.

    Concernant la fermeture de session à la fermeture du navigateur, il faut peut-être regarder en javascript, il y a peut-être un moyen d'intercepter la fermeture du browser (à voir si ça marche pour tous browser...) et de poster le formulaire en simulant le click sur un bouton de ton appli qui terminerait la session (si tu veux je pourrait t'aider pour cette partie si tu trouve le js). Ceci n'est d'ailleurs pas un pb spécifique à intraweb, mais à tous serveur gérant une session utilisateur.

    Concernant ton plantage, ce que je te conseillerai dans un premier temps, c'est de recréer un projet vierge intraweb pour le laisser créer ses unités de base, et notament l'unité iwusersessionunit. Tu y ajoute ensuite tes propres unités et tu mets les function de ta classe TIWUserSession dans cette nouvelle classe. Ca devrait remettre les choses "propres" au niveau d'intraweb.

    Ensuite j'insiste, mais utilise memcheck pour voir si tu es propre dans la gestion mémoire, une fuite mémoire pouvant expliquer la montée en mémoire et le ralentissement de ton application (surtout si tu le constate en étant le seul utilisateur, donc avec une seule session).

    Pour ce qui est de redémarrer une application plantée, si tu l'as installée en tant que service windows, il y a des options dans les propriétés du service qui permettent de relancer automatiquement un service qui tombe (tu peux le relancer systématiquement, ou 1x, 2x et lancer un autre pgm au 3ème plantage).
    Si ton serveur est un pgm standalone, alors il te faudra faire un autre pgm qui sera chargé de surveiller que le premier tourne bien.

    @++
    Dany

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 22
    Par défaut
    Bonsoir,

    Pour recréer les unités Intraweb de session, j'ai bien fait comme tu le dis. C'est à dire crée une nouveau projet où j'ai remis mes fonctions.

    Si j'ai bien compris la notion de variables globales, je n'ai donc pas de variables globales car je n'ai pas besoin de variables pour les différentes session. J'ai besoin de variables pour chaque session : je les ai déclaré au niveau de TUserSession=Class(TIWUserBaseSession). C'est pour cela que je les détruit à chaque fin de session.

    Je vais suivre ton conseil et utilser MemCheck. Je l'ai d'ailleurs téléchargée. Appremment, c'est une unité qu'il faut rajouter au projet.

    En tout cas merci beaucoup pour tes conseil.

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 22
    Par défaut
    Que dois-je tester réellement pour savoir que mon module Intraweb tourne bien?
    En fait, J'ai bien quelques choses de ce type mais quand je teste si le module tourne, une nouvelle session est ouverte à chaque fois par Intraweb. Et comme je teste tous les 5 minutes, j'ai plein de sessions ouvertes qui se ferment au bout de 15 minutes (TimeOut).
    C'est peut être mon problème...Même s'il n y a pas de réel utilisateur, une session est créee...

    Merci

  18. #18
    Membre extrêmement actif
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 219
    Par défaut
    Bonsoir,

    pour tester si ton appli tourne, il faut regarder dans les process windows (je n'ai pas le source sous la main mais tu devrais le trouver assez facilement). Ce procédé ne crééra pas de session mais ne te garantira que du fait que le serveur n'est pas tombé.

    @++
    Dany

Discussions similaires

  1. Différence IntraWeb, Composant ASP, COM+, DLL ISAPI / CGI
    Par [DreaMs] dans le forum Web & réseau
    Réponses: 0
    Dernier message: 28/04/2009, 15h26
  2. [Delphi 2005][IntraWeb]StandAlone => Dll pour Apache
    Par Giovanny Temgoua dans le forum Langage
    Réponses: 1
    Dernier message: 03/02/2006, 09h18
  3. [D7][IntraWeb] conversion de standalone en ISAPI
    Par Magnus dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/10/2005, 09h27
  4. [D7][intraweb] accéder par le réseau au serveur standalone
    Par Magnus dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/10/2005, 12h34
  5. IntraWeb et ISAPI ...
    Par Djedjeridoo dans le forum Web & réseau
    Réponses: 19
    Dernier message: 16/08/2004, 14h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo