質問の背景:
ロジックコードが多くのXMLファイルに含まれるデータの読み取りに依存しているWebApiコントローラーがあります。これらのXMLファイルは、WebApiプロジェクトのApp_Data
フォルダーに含まれています。
問題:
次の方法でXMLファイルの相対パスを使用しようとしています。
[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);
}
WebApiコードを実行し、CallerOne
メソッドのUrlを呼び出すと、次のエラーが表示されます。
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'.
また、最終的にこれをAzureに発行し、これらのファイルを含めたいと思います。
App_Data
フォルダー内のXMLファイルを読み込むために相対パスを使用するにはどうすればよいですか?
答えを見つけました。
WebApiプロジェクトの相対パスを読み取るには、次のものが必要です。
var fullPath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/App_Data/yourXmlFile.xml");
Jdwengが数か月前に推測したように、Environment.GetEnvironmentVariable( "AppData")は好ましい方法。 OPの自動受け入れられた答えは、まったく異なる結果をもたらします。たとえば、私のプロジェクトで両方を使用すると、次のようになります。
C:\\Projects\\PlatypusReports\\PlatypusReports\\App_Data\\yourXmlFile.xml
... OPの長いコード、つまりこれ:
var fullPath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/App_Data/yourXmlFile.xml");
...この:
C:\\Users\\cshannon\\AppData\\Roaming
... jdwengのコードの場合、
string appData = Environment.GetEnvironmentVariable("AppData");
OTOH、このコード:
string appDataFolder = HttpContext.Current.Server.MapPath("~/App_Data/");
戻り値:
C:\\Projects\\PlatypusReports\\PlatypusReports\App_Data\
そのため、結果(方法論でない場合)は上記の最初の例と非常に似ています。私は実際にそれを 私が尋ねた質問 から約2年前に取得しましたが、これは忘れていました。
アプリをサーバーに展開した後、jdwengのアプローチが期待どおりに機能するかどうかはわかりませんが、他のアプローチよりも自信があります。
誰でも確認できますか?
受け入れられた答え here はタイピング時に237の賛成票を持っているので、6歳(犬の年では42、これは良い兆候かもしれません)にもかかわらず、かなり信頼できるようです。
あなたのアプローチは問題ありません。あなたはいくつかのtpyingエラーがありました、あなたは書きました
string docOne = @"~\AppData\DocOne.xml";
しかし、それはあったはずです
string docOne = @"~\App_Data\DocOne.xml";