Pas de problème (pb), que du PowerBuilder (PB) ^^

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 14-08-2013 05:50:52

YavaDeus  
Membre
Date d'inscription: 30-07-2012
Messages: 7
Pépites: 49
Banque: 0

Accès à un chemin externe depuis un webService

Bonjour,

Je rencontre un problème dans la conception d'un webService avec PB12.5. (Je débute encore avec la notion de webService)
Pour faire simple, je voudrais que le webService en question puisse aller lire/écrire dans des fichiers externes.
J'ai cherché sur le forum, mais je n'ai pas trouvé de réponse pertinente.
Je pose donc la question, en espérant que ce que je cherche est possible et que l'un d'entre vous saura m'aider.

En fait, j'ai une application lourde qui se connecte à une base de données
Et j'ai créé un WebService avec des méthodes pour permettre à des applications externes d'obtenir des informations de la même base de données.
Mon application d'origine utilise un fichier config.ini pour obtenir les données de connexion.
Et pour éviter des problème de paramétrage lors du déploiement ou des mises à jour, je veux que le webService aille lire les données de connexion dans le même fichier config.ini

Sauf que je n'ai trouvé aucun moyen d'accéder à un répertoire qui n'est pas directement inclu dans l'arborescence du webService.
Pour l'instant j'ai duppliqué le fichier config.ini dans

C:\inetpub\wwwroot\Appli_root\file\common\C\RessourcesWEB\config.ini

Le fichier est alors apparemment copié dans

C:\inetpub\wwwroot\Appli_root\file\session\C\RessourcesWEB\config.ini

" a chaque appel du webService.
Et je peux y accéder en utilisant le chemin

C:\RessourcesWEB\config.ini

dans mon code.
Mais c'est exactement la solution que je voulais éviter au départ

En production, le WebService n'est même pas forcé d'être déployé sur la même machine que l'application d'origine.
je voulais pouvoir utiliser un chemin du genre :

\\ServeurAppli\Appli\config.ini

Mais avec ce chemin, le webService pointe en réalité vers cà:

C:\inetpub\wwwroot\Appli_root\file\session\ServeurAppli\Appli\config.ini

J'ai ensuite tenté plusieurs chose.
Je voulais créer un répertoire paramétré dans le web.config.
Mais dans un projet de type WebService, on ne peut créer de paramétres personnalisés dans web.config, ce n'est possible que dans un projet d'application web. (Je n'ai d'ailleurs pas compri pourquoi)
Et même si j'ajoute la clé manuellement dans le web.config du webService publié, je n'ai pas réussi à l'utiliser dans le code.

J'ai essayé de créer un répertoire virtuel dans IIS dans le site déployé.
Mais je ne sais pas si je peux, et comment l'utiliser dans le code.

Et c'est ici que je bloque, je n'ai pas d'autre idée ni trouvé aucune solution dans les topics dédiés aux webservices PB .NET
Je suis pourtant certain d'être passé à coté d'une solution simple, mais je n'avais jamais fait du web avec PB et je sèche la dessus depuis quelque temps.

Cordialement, merci d'avance pour vos réponses

Hors ligne

 

#2 14-08-2013 06:33:14

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: Accès à un chemin externe depuis un webService

YavaDeus a écrit:

Je voulais créer un répertoire paramétré dans le web.config.
Mais dans un projet de type WebService, on ne peut créer de paramétres personnalisés dans web.config, ce n'est possible que dans un projet d'application web. (Je n'ai d'ailleurs pas compri pourquoi)
Et même si j'ajoute la clé manuellement dans le web.config du webService publié, je n'ai pas réussi à l'utiliser dans le code.

J'ai essayé de créer un répertoire virtuel dans IIS dans le site déployé.
Mais je ne sais pas si je peux, et comment l'utiliser dans le code.

Bonjour, j'avais déjà été confronté à ce problème, mais il s'agissait d'un projet PB.NET : http://pbadonf.fr/forum/viewtopic.php?pid=16540#p16540

A mon avis c'est bien du côté du serveur web, qu'il faut chercher. (j'imagine que c'est un "cas d'école", puisque souvent les serveurs webs, d'applis, de fichiers ne sont pas sur les mêmes machines, comme dans ton cas)


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#3 20-08-2013 13:39:03

YavaDeus  
Membre
Date d'inscription: 30-07-2012
Messages: 7
Pépites: 49
Banque: 0

Re: Accès à un chemin externe depuis un webService

Merci pour cette réponse rapide.
J'ai analysé ce qui avait été proposé dans le TOPIC 16540 mis en lien pour voir ce qui est applicable à mon projet, mais je suis encore bloqué.

Voilà ce que j'ai essayé :

Une options est de changer dans le web.config la racine des fichiers :

Code:

<!-- Base folder for the Web file system -->
<add key="FileFolder" value="{WebAppDir}..\webreport_root\file" />

Ca fonctionne très bien puisse que je peux mettre n'importe quelle répertoire en racine.
Je peux donc lui spécifier un chemin externe dans lequel j'aurai placé mes fichiers de config.
Malheureusement, comme ça déplace toute la racine de \FILE, je suis encore soumis à l'arborescence \common\..., alors que le fichier que je cherche à lire est déjà placé à un endroit très précis et non modifiable.
De plus ça va également déplacer les fichiers de session sur mon serveur externe, ce que je voudrais éviter aussi;

Cette solution n'est donc pas encore optimale, même si j'ai avancé un peu.


L'autre option vue est d'utiliser une portion de code de ce type :

Code:

#if defined PBWEBFORM then
 filepathname = "c:\Avoid virtual.txt"
 texte = System.IO.File.ReadAllText(filepathname)
#end if

Ca, ca semble parfait
Je peux définir un répertoire dans le code
Je peux utiliser le tag PBDOTNET a la place de PBWEBFORM (car je suis en webservice, pas en webform)
Et ensuite, j'utilise apparemment l'API .NET pour accéder à mon fichier. (sur une fonction qui m'est inconnue mais que j'ai retrouvée dans la doc Microsoft)
Sauf que je n'ai pas réussi a le faire fonctionner.
Forcément ça compile grace aux intructions de précompilation
Mais lors de l'appel au webservice, j'obtiens une méchante erreur sur l'appel à System.IO.File.ReadAllText:

Code:

System.Web.Services.Protocols.SoapException: Échec de la demande d'autorisation de type 'System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. ---> System.Security.SecurityException: Échec de la demande d'autorisation de type 'System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
   à System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
   à System.Security.CodeAccessSecurityEngine.Check(CodeAccessPermission cap, StackCrawlMark& stackMark)
   à System.Security.CodeAccessPermission.Demand()
   à System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
   à System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
   à System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize)
   à System.IO.StreamReader..ctor(String path, Encoding encoding)
   à System.IO.File.InternalReadAllText(String path, Encoding encoding)
   à System.IO.File.ReadAllText(String path)
   à c__importxml.testconnexion(PBString testarg)
   à cns_webservice.PBWS__importxml.testconnexion(String testarg) dans c:\DATA\DEV\webService\pb2cstempout\webservice.asmx.cs:ligne 131
   --- Fin de la trace de la pile d'exception interne ---
   à Sybase.PowerBuilder.Web.WebServices.PBWebService.HandleException(Exception ex)
   à cns_webservice.PBWS__importxml.testconnexion(String testarg) dans c:\DATA\DEV\2.300\webService\pb2cstempout\webservice.asmx.cs:ligne 141

J'ai essayé dans le doute de donner tous les droits possibles sur le fichier en question (ASP.NET, IUSR, etc...), mais ça n'a rien changé
Je ne sais pas non plus si je doit lier explicitement cette fonction dans le code (via Global External Functions) pour être autorisé à l'utiliser.

Dernière modification par YavaDeus (20-08-2013 15:53:38)

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22