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

use*_*057 18 c# xml asp.net-mvc azure asp.net-web-api

问题背景:

我有一个WebApi控制器,其逻辑代码依赖于读取包含在许多XML文件中的数据.这些XML文件已包含在App_DataWebApi项目的文件夹中.

问题:

我试图以下列方式使用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);
    }
Run Code Online (Sandbox Code Playgroud)

运行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'.
Run Code Online (Sandbox Code Playgroud)

我还想最终将其发布到Azure并包含这些文件.

如何使用相对路径读取文件App_Data中的XML文件

use*_*057 38

结束找到答案.

需要以下内容来读取WebApi项目中的相对路径:

var fullPath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/App_Data/yourXmlFile.xml");
Run Code Online (Sandbox Code Playgroud)


B. *_*non 6

正如jdweng几个月前推断的那样,Environment.GetEnvironmentVariable("AppData")似乎是首选的方法.OP的自动接受的答案给出了截然不同的结果.例如,在我的项目中使用这两个,我得到:

C:\\Projects\\PlatypusReports\\PlatypusReports\\App_Data\\yourXmlFile.xml
Run Code Online (Sandbox Code Playgroud)

...对于OP的冗长代码,即:

var fullPath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/App_Data/yourXmlFile.xml");
Run Code Online (Sandbox Code Playgroud)

...还有这个:

C:\\Users\\cshannon\\AppData\\Roaming
Run Code Online (Sandbox Code Playgroud)

...对于jdweng的代码,即:

string appData = Environment.GetEnvironmentVariable("AppData");
Run Code Online (Sandbox Code Playgroud)

OTOH,这段代码:

string appDataFolder = HttpContext.Current.Server.MapPath("~/App_Data/");
Run Code Online (Sandbox Code Playgroud)

收益:

C:\\Projects\\PlatypusReports\\PlatypusReports\App_Data\
Run Code Online (Sandbox Code Playgroud)

所以它与上面第一个例子的结果(如果不是方法论)非常相似.我实际上是从两年前我问过的一个问题中得到的,这个问题我已经忘记了.

如果应用程序部署在服务器上,jdweng的方法可以按预期工作,我并不乐观,但我比其他方法更有信心.

谁能验证?

UPDATE

这里接受的答案打字时有237个赞成票,所以看起来非常可靠,虽然6岁(狗年42岁,这可能是一个好兆头).

  • 您更新中接受的答案是使用您通常无法在WebApi中访问的HttpContext (2认同)