web-dev-qa-db-fra.com

Web Api - Comment inclure des chemins relatifs pour inclure des fichiers XML App_Data?

Contexte de la question:

J'ai un contrôleur WebApi dont le code logique repose sur la lecture des données contenues dans un certain nombre de fichiers XML. Ces fichiers XML ont été inclus dans le dossier App_Data du projet WebApi.

Le problème:

J'essaie d'utiliser le chemin relatif des fichiers XML de la manière suivante:

    [System.Web.Http.HttpGet]
    public string CallerOne()
    {
        string docOne = @"~\AppData\DocOne.xml";

        string poll = @"~\AppData\Poll.xml";

        var response =  _Caller.CallService(docOne, poll);

        return ConvertXmlToJson(response);
    }

Lors de l'exécution du code WebApi et de l'appel de l'URL à la méthode CallerOne, le message d'erreur suivant s'affiche:

An exception of type 'System.IO.DirectoryNotFoundException'
occurred in  System.Xml.dll but was not handled in user code

Additional information: Could not find a part of the path
'C:\Program Files  (x86)\IIS Express\~\AppData\FPS.xml'.

Je souhaite également publier éventuellement ceci dans Azure et inclure ces fichiers.

Comment puis-je utiliser le chemin relatif pour lire les fichiers XML dans le dossier App_Data?

17
user1352057

J'ai fini par trouver la réponse.

Ce qui suit est nécessaire pour lire les chemins relatifs dans un projet WebApi:

var fullPath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/App_Data/yourXmlFile.xml");
36
user1352057

Comme jdweng l'a déduit il y a plusieurs mois, Environment.GetEnvironmentVariable ("AppData")} semblerait être la méthode préférée. La réponse auto-acceptée du PO a donné des résultats très différents. Par exemple, en utilisant les deux dans mon projet, je reçois:

C:\\Projects\\PlatypusReports\\PlatypusReports\\App_Data\\yourXmlFile.xml

... pour le code long du PO, à savoir:

var fullPath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/App_Data/yourXmlFile.xml");

...et ça:

C:\\Users\\cshannon\\AppData\\Roaming

... pour le code de jdweng, à savoir:

string appData = Environment.GetEnvironmentVariable("AppData");

OTOH, ce code:

string appDataFolder = HttpContext.Current.Server.MapPath("~/App_Data/");

résultats:

C:\\Projects\\PlatypusReports\\PlatypusReports\App_Data\

Les résultats (sinon la méthodologie) sont donc très similaires au premier exemple ci-dessus. Je l’ai en fait tirée de une question que j’ai posée il ya presque deux ans, que j’avais oubliée.

Je ne suis pas sûr que l'approche de jdweng fonctionne comme prévu une fois l'application déployée sur un serveur, mais j'ai beaucoup plus confiance en elle que les autres approches.

Quelqu'un peut-il vérifier?

METTRE À JOUR

La réponse acceptée ici a 237 votes positifs au moment de la frappe, semble donc assez fiable, bien que âgée de 6 ans (42 ans dans les années de chien, ce qui peut être un bon signe).

6
B. Clay Shannon

Votre approche est bien. Vous avez juste eu une erreur de lecture, Vous avez écrit

string docOne = @"~\AppData\DocOne.xml";

Mais cela aurait dû être 

string docOne = @"~\App_Data\DocOne.xml";
0
user1451111