2010-10-11 6 views
0

J'ai une application de service Web native (ISAPI) que j'ai créée avec Delphi 2010. Pour le moment, elle n'expose que deux méthodes. Le premier, EchoString, est conçu pour me faire savoir que le service Web fonctionne correctement et ajoute quelques caractères à la chaîne que je lui envoie de mon client de service Web Delphi. Cela fonctionne toujours bien.Comment configurer IIS 7 pour autoriser une connexion à une base de données distante à partir d'un serveur Web ISAPI?

La deuxième méthode exposée est celle qui m'intéresse vraiment. Je passe cette méthode une chaîne qui contient le contenu XML d'un ClientDataset. Du côté serveur, mon code prend ce XML et l'insère dans un ClientDataset, après quoi il publie ces données dans une base de données côté serveur. J'utilise des composants IBExpress (IBDatabase, IBTransaction, IBQuery, etc.) pour me connecter à une base de données InterBase côté serveur.

Le problème est que dès que je tente de connecter le composant IBDatabase à sa base de données, la méthode Web échoue. Je pense que j'ai exclu toutes les autres sources pour cette erreur. Je peux créer et remplir le ClientDataset avec un XML ClientDataSet plutôt volumineux envoyé depuis le client qui inclut des jeux de données imbriqués sans problème (j'utilise l'unité MidasLib, donc le ClientDataSet n'essaye pas de charger une DLL). Je peux créer et configurer, à court de connexion, l'IBDatabase et ses divers composants. Encore une fois, sans problèmes. Dès que j'ai défini la propriété Connected du composant IBDatabase sur True à partir du service Web, il échoue. Je lance IIS 7.5 sous Windows 7 64 bits Ultimate (sur ma machine de développement). J'ai essayé d'accorder des droits de contrôle complets à tout le monde (ainsi que spécifiquement à IIS_IUSRS) à la DLL ISAPI spécifique, ainsi qu'au répertoire entier dans lequel le service Web réside. Cela n'a pas résolu le problème. Je suppose qu'il s'agit d'un problème de privilèges avec IIS 7. Que puis-je faire pour permettre à mon service Web ISAPI de se connecter à l'API client InterBase afin de pouvoir utiliser le service Web pour écrire sur mon serveur de base de données? Post-scriptum: Il semble que la connexion à Interbase à partir du service Web n'est pas le problème. Je suis toujours à la recherche de la cause exacte, mais j'ai maintenant réussi à me connecter à Interbase à partir du service Web. Je mettrai à jour ce post une fois que je connaîtrai la cause, mais cette question n'est plus valide. '' '' ''
Je marque la réponse de Bob comme la bonne. La chaîne de connexion était erronée. En fait (et c'est embarrassant, mais je préfère être embarrassé que trompeur), j'ai été mordu par une clause avec. J'ai stocké mes informations de connexion dans les chaînes de ressources. J'ai fait la cession dans une clause avec. Le nom de la chaîne de ressources pour la propriété DatabaseName était DatabaseName. La clause avec a provoqué l'assignation de la propriété DatabaseName à elle-même, au lieu de la valeur dans la chaîne de ressource. J'ai corrigé le problème en préfacant la chaîne de ressource DatabaseName avec le nom de l'unité (ie, DatabaseName: = IBModUnit.DatabaseName;).

+0

En supposant que IIS et Interbase s'exécutent en tant que services, s'exécutent-ils tous les deux sous le même compte? L'exécution d'Interbase en tant que service est un facteur important, mais simplement parce que si elle n'est pas exécutée en tant que service, elle ne sera certainement pas exécutée sous le même compte que IIS. –

+0

Dans ce cas, IIS et InterBase sont des services. Je pense que le problème est qu'un problème de configuration dans IIS empêche mon service Web d'appeler l'API Interbase installée sur l'ordinateur sur lequel le service Web est en cours d'exécution. C'est bizarre, étant donné que je peux écrire sur le système de fichiers local à partir de mon service Web. –

Répondre

1

Je suppose que vous pouvez utiliser la même chaîne de connexion pour vous connecter à la base de données InterBase à partir d'une application Fiches VCL "native" sur cette machine? Une question idiote peut-être, mais exécutez-vous InterBase en tant que service? (Sinon, la DLL ISAPI ne pourra pas "le voir" pour s'y connecter).

+0

Oui, sur la machine locale, la même sur laquelle j'ai testé le service Web, une application cliente native peut utiliser IBDatabase pour se connecter au service. –

+0

Mais interBase fonctionne-t-il comme un service sur cette machine? –

+0

Oui. InterBase s'exécute en tant que service Windows. Je démarre et arrête Interbase à l'aide de l'applet Services dans Outils d'administration. Il est également vrai que ce service fonctionne sur la même machine dans laquelle le service Web est installé, mais je ne pense pas que cela change quoi que ce soit. –

0

[Éditer]
Désolé. J'ai écrit une chose stupide suggérant que IIS n'aura pas les permissions réseau < duh!> et je n'arrive pas à supprimer ce post! Mais j'ai lu quelque part que les permissions de service sur les versions ultérieures de Windows ont été quelque peu réduites et que le compte système local n'a plus accès au réseau. Vu que le titre du message contient "remote", vous devez peut-être accorder des permissions supplémentaires à votre DLL ou service et/ou au service Interbase ou à l'un des autres fichiers concernés?

+0

Oui, j'ai utilisé le mot remote, dans la mesure où la version d'Interbase que j'utilise est un serveur de base de données distant. Dans l'environnement de test particulier, il s'agit d'un serveur hors processus s'exécutant sur la même machine (en tant que service Windows), mais cela ne devrait pas avoir d'effet sur ce que je vois. L'API Interbase prend la responsabilité de diriger mes demandes vers un serveur distant, si la base de données est sur une autre machine. Je ne peux même pas parler à l'API, apparemment. –

+0

Ok. Une autre question, peut-être stupide. Fbclient.dll (ou l'autre gds ??? something ou autre) est-il visible par le service IIS? Peut-être qu'il doit être dans le même répertoire que la DLL isapi - de cette façon, au moins, nous savons qu'il peut être exécuté. Les principales raisons pour lesquelles je n'avais pas réussi à ouvrir la connexion étaient soit aucune définition d'alias fbclient, soit une définition d'alias incorrecte (ou manquante). – shunty

+0

Bonne suggestion. Je vais examiner cela ce soir. –

Questions connexes