问题背景:
我有一个WebApi控制器,他的逻辑代码依赖于读取许多XML文件中包含的数据。这些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代码并调用Url到CallerOne
方法时,收到以下错误:
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文件?
答案 0 :(得分:36)
结束找到答案。
需要以下内容来读取WebApi项目中的相对路径:
var fullPath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/App_Data/yourXmlFile.xml");
答案 1 :(得分:6)
正如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\
因此,上述第一个例子的结果(如果不是方法论)非常相似。实际上,我差不多两年前从a question I asked得到了它,这是我忘记的。
如果应用程序部署在服务器上,jdweng的方法可以正常工作,我并不乐观,但我比其他方法更有信心。
任何人都可以验证吗?
接受的答案here在打字时有237个赞成票,所以看起来非常可靠,虽然6岁(狗年42岁,这可能是一个好兆头)。
答案 2 :(得分:0)
你的方法很好。你只是有一些tpying错误, 你写了
string docOne = @"~\AppData\DocOne.xml";
但它应该是
string docOne = @"~\App_Data\DocOne.xml";