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)
正如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的方法可以按预期工作,我并不乐观,但我比其他方法更有信心.
谁能验证?
这里接受的答案在打字时有237个赞成票,所以看起来非常可靠,虽然6岁(狗年42岁,这可能是一个好兆头).
| 归档时间: |
|
| 查看次数: |
23389 次 |
| 最近记录: |