WebApi - 如何为包含的App_Data XML文件包含相对路径?

时间:2015-08-07 21:15:34

标签: c# xml asp.net-mvc azure asp.net-web-api

问题背景:

我有一个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文件?

3 个答案:

答案 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";