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 :

[Web Service] [ISAPI] [Paradox]al ! Sessions ambigües


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Par défaut [Web Service] [ISAPI] [Paradox]al ! Sessions ambigües
    Bonjour,

    Je tente de développer un web service en delphi (avec Delphi 2007) : je génère une dll que je met dans un répertoire virtuel de IIS 5, ma DLL est configuré dans les Filtres ISAPI de IIS. Tests sous XP SP3 actuellement, pas de problèmes, mon service répond bien, mon fichier .ini est bien chargé, jusque là je m'en suis plutôt bien sortit ^^

    par contre, je dois faire accès à des tables paradox, et là il y a comme un os... mon objet session refuse de pointer ver le répertoire NetFileDir (et oui je ne suis pas le seul avec mon webservice à accéder à ces tables...)

    Si je supprime mon objet TSession pour utiliser les paramètres par défaut, j'obtiens cette erreur logique :
    C:\WINDOWS\SYSTEM32\PDOXUSRS.LCK
    Permission refusée.
    Impossible d'accéder au répertoire.

    Donc quand je configure correctement mon objet session, il pointe vers un dossier de la machine, mais il semblerait que IIS me l'interdise...

    Y a-t-il des droits particuliers à configurer sous IIS ou des paramètres spécifiques dans Delphi ?

  2. #2
    Membre Expert

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Par défaut
    Déjà il va falloir faire attention à plusieurs choses.

    Avec un filtre ISAPI, c'est IIS qui exécute le code, c'est à dire un service windows et non pas l'utilisateur connecté.
    Donc si ton appli doit écrire dans System32, il faut que le compte Windows utilisé pour exécuter le service IIS (ou le pool d'application selon ton paramétrage) possède les droits suffisant pour accéder à System32.
    Par défaut, IIS doit être configuré avec un compte assez restreint (question de sécurité).

    Deuxièmement IIS en ISAPI est multi-threadée. Et le BDE n'est pas thread-safe ! Avec le BDE, il faut que chaque thread travaillent avec une session différente !
    Concrêtement, lors de chaque appel à ton Webservice, il faut bien te dire que c'est peut-être un thread différent qui exécute ta requête. Et que ton WebService peut être appelé simultanément par deux threads différents.
    Autrement dit, pour le BDE, il vaut mieux que tu ouvres une session différente par invocation du Webservice.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Par défaut
    Wow merci de ta réponse !!

    effectivement, j'avais trouvé l'option multi threadé intéressante, mais quand je charge en même temps deux appli, j'ai deux blocages BDE...

    j'ai résolu mon problème de session, en le mettant dans un dossier ou IIS user a des droits.

    Donc en gros, il vaudrait mieux que je ne fasse pas une dll mais un exécutable indépendant ? ou il existe un moyen de laisser ma dll dans IIS avec une configuration particulière ? ou peut-être remplacer ou enlever CoInitFlags := COINIT_MULTITHREADED; dans le source de mon projet ?

    j'avoue que je touche à quelque chose qui m'est obscur, et j'avance à tatons ^^

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Par défaut
    [edit : ménage]

    J'allais dire une c...

    Bref il y a un concept dans le web service que je ne comprend pas... j'ai un web service, qui contient des objets permettant de se connecter à une base, executer des requêtes (...) dans un data module.

    Est-ce que chaque client instancie le service intégralement ? ou est-ce que, par exemple, le WebModuleCreate n'est lancé que par le premier utilisateur et c'est l'interface de cette instance du service qui est appelée par tous les clients ? parce que dans ce dernier cas, dès qu'une instruction utilise un objet, une instruction d'un autre utilisateur peut être en train de l'utiliser...

    Si la solution et d'instancier le web service intégralement pour chaque client et que ça peut être géré de manière tranparente pas IIS, ça me va, il ne me reste qu'à gérer la session bde dans un répertoire différent pour chaque utilisteur ( c'est toujours moins lourd que de configurer un web service par client potentiel !!!!!!!!! ).

    help inside needed ^^

  5. #5
    Membre Expert

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Par défaut
    Citation Envoyé par darkendorf Voir le message
    Bref il y a un concept dans le web service que je ne comprend pas...
    Effectivement. Un WebService est avant tout une application Serveur qui dialogue avec les clients en mode Web (echange HTTP via SOAP ou REST).

    Le service est instancié/démarré lorsque IIS charge la DLL. C'est tout l'intérêt de l'ISAPI, le serveur est chargé une fois, reste en mémoire, et est interrogé en multi-threading par différents clients.
    La question est de savoir quand est-ce que tu instancies ton datamodule. Si c'est au démarrage de l'application, via une variable globale, il n'y a qu'un seul datamodule partagé entre tous les clients.
    Si c'est au début du traitement de la méthode appellée par le client, dans une variable locale à cette dernière, tu as une instance par client (et même par invocation).

    Si la solution et d'instancier le web service intégralement pour chaque client et que ça peut être géré de manière tranparente pas IIS, ça me va, il ne me reste qu'à gérer la session bde dans un répertoire différent pour chaque utilisteur ( c'est toujours moins lourd que de configurer un web service par client potentiel !!!!!!!!! ).
    Si tu veux que ton web service soit lancé à chaque appel client, fait une application CGI au lieu de l'ISAPI.
    Ca veut dire qu'à chaque appel, IIS lancera une nouvelle instance de l'exe qui sera détruite à la fin de la requête du client. Dans ce mode, il n'est plus question de multi-threading. Une requête = Une instance de l'application CGI.
    C'est beaucoup plus simple à coder. Par contre c'est aussi beaucoup moins performant. Surtout si tu as un temps de connexion du BDE important.

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    En Delphi 2007, tu as DevExpress avec les drivers MySQL fourni avec non ?
    Tu devrais plutôt investir dans une technologique plus robuste que Paradox (obselète depuis Delphi 5 ~ 2000) , mieux vaudrait du BlackFish, InterBase ou FireBird, cela reste très proche de Borland\CodeGear, et surtout c'est maintenu !

    DevExpress est pénible pour une utilisation avec des grilles, mais dans un WS, tu n'as pas besoin de curseur bi-directionnel, c'est probablement la couche d'accès aux données la plus rapide avec celle de CoreLab\Devart ... couplé à MySQL par exemple

    Pas de question à se poser sur le multi-thread (du moins pas trop) et pas de
    problème de droits, la DLL WS et le process DB sont indépendants !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 109
    Par défaut
    Oui la connexion à bde n'est pas ce que l'on peut appeler instantanée... j'instancie manuellement mon unité UDataModule dans l'événement OnCreate du WebModule : DMmonService := TDMmonService.Create(Self);
    Et dans le OnCreate du DM je paramètre mes objets bde (répertoire de démarrage - privateDir -, répertoire de partage de la connexion bde - NetFileDir - ...).

    Si c'est au début du traitement de la méthode appelée par le client, dans une variable locale à cette dernière, tu as une instance par client (et même par invocation).
    c'est ce qu'il me faut ^^

    donc il me suffirait d'instancier mon DataModule dans l'implémentation de l'interface...

    par contre, les fichiers fichiers bde LCK doivent du coup se trouver dans un répertoire différent à chaque fois, sinon c'est bde qui va refuser de s'ouvrir quand une connexion est en cours...

    suis-je sur la bonne voie ?

    PS : une requête n'a besoin d'être effectuée qu'au chargement de la DLL, je peux donc imaginer enregistrer son résultat dans une variable de mon WM pour qu'il la partage avec les autres instances, c'est bien ce qu'il faut comprendre ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Web Service ISAPI avec paramètres
    Par curt25 dans le forum Web & réseau
    Réponses: 1
    Dernier message: 05/05/2011, 13h40
  2. client ASP et WEB SERVICE probleme gestion de session
    Par rosty38 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 04/06/2010, 14h38
  3. Web Service isapi et IIS7 64 bits
    Par eagle671 dans le forum Web & réseau
    Réponses: 3
    Dernier message: 27/04/2010, 13h51
  4. Session dans les web services
    Par casper_mc dans le forum Services Web
    Réponses: 1
    Dernier message: 27/06/2008, 21h46
  5. [D7]Web Services, ISAPI, WebSnap : Lequel choisir ?
    Par jambonstar dans le forum Delphi
    Réponses: 1
    Dernier message: 18/09/2006, 12h43

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