webentwicklung-frage-antwort-db.com.de

Web Api - Wie füge ich relative Pfade für Include-App_Data-XML-Dateien hinzu?

Hintergrund der Frage:

Ich habe einen WebApi-Controller, dessen Logikcode auf dem Lesen von Daten in einer Reihe von XML-Dateien beruht. Diese XML-Dateien wurden im Ordner App_Data des WebApi-Projekts enthalten.

Die Angelegenheit:

Ich versuche, den relativen Pfad der XML-Dateien folgendermaßen zu verwenden:

    [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);
    }

Wenn Sie den WebApi-Code ausführen und die URL der CallerOne-Methode aufrufen, erhalte ich folgende Fehlermeldung:

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'.

Ich möchte dies schließlich auch in Azure veröffentlichen und diese Dateien einschließen.

Wie kann ich den relativen Pfad zum Einlesen der XML-Dateien im Ordner App_Dataverwenden?

17
user1352057

Am Ende fand ich die Antwort.

Zum Lesen der relativen Pfade in einem WebApi-Projekt ist Folgendes erforderlich:

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

Wie jdweng vor einigen Monaten folgerte, scheint Environment.GetEnvironmentVariable ("AppData") die bevorzugte Methode zu sein. Die automatisch akzeptierte Antwort des OP und die Ergebnisse sind recht unterschiedlich. Wenn Sie zum Beispiel beide in meinem Projekt verwenden, erhalte ich Folgendes:

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

... für den langatmigen Code des OP, und zwar:

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

...und das:

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

... für den Code von jdweng, das heißt:

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

OTOH, dieser Code:

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

kehrt zurück:

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

Es ist also in Ergebnissen (wenn nicht in der Methodik) dem ersten Beispiel oben sehr ähnlich. Ich habe es tatsächlich von eine Frage, die ich gestellt habe vor fast zwei Jahren gemacht, die ich vergessen hatte.

Ich bin nicht sicher, ob der Ansatz von jdweng wie erwartet funktionieren würde, sobald die App auf einem Server bereitgestellt wird, aber ich habe viel mehr Vertrauen als andere Ansätze.

Kann jemand das überprüfen?

AKTUALISIEREN

Die akzeptierte Antwort hier hat 237 Upvotes zum Zeitpunkt des Tippens, scheint also ziemlich zuverlässig zu sein, obwohl sie 6 Jahre alt ist (42 in Hundejahren, was ein gutes Zeichen sein kann).

6
B. Clay Shannon

Ihr Ansatz ist gut. Sie hatten gerade einen Fehler, Sie haben geschrieben

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

Aber es hätte sein sollen 

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