255

由于Microsoft Web API不是MVC,因此您不能执行以下操作:

var a = Request.MapPath("~");

也不是这个

var b = Server.MapPath("~");

因为这些在System.Web命名空间下,而不是System.Web.Http命名空间下。

那么如何计算Web API中的相对服务器路径呢?我曾经在MVC
中做这样的事情:

var myFile = Request.MapPath("~/Content/pics/" + filename);

这会给我磁盘上的绝对路径:

"C:\inetpub\wwwroot\myWebFolder\Content\pics\mypic.jpg"
4

8 回答 8

495

您可以在对象不可用的任何上下文中使用HostingEnvironment.MapPath(例如,也来自静态方法)。System.WebHttpContext.Current

var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/SomePath");

另请参阅Server.MapPath 和 HostingEnvironment.MapPath 有什么区别?

于 2013-05-15T05:01:00.063 回答
14
string root = HttpContext.Current.Server.MapPath("~/App_Data");
于 2013-11-14T17:25:44.827 回答
2

除了那些偶然发现的人之外,使用 HostingEnvironment 调用运行测试级别的一种好方法是,如果访问映射到 ~/example/ 的 UNC 共享:\example\,您可以执行此操作来绕过IIS-Express 问题:

#if DEBUG
    var fs = new FileStream(@"\\example\file",FileMode.Open, FileAccess.Read);
#else
    var fs = new FileStream(HostingEnvironment.MapPath("~/example/file"), FileMode.Open, FileAccess.Read);
#endif

如果您有权对文件进行本地测试,但在生产中需要 env 映射,我发现这很有帮助。

于 2015-05-12T16:19:48.330 回答
1

我无法从您提供的上下文中判断,但如果这是您只需要在应用启动时执行的操作,您仍然可以使用Server.MapPathin WebApiHttpApplication; 例如在Application_Start().

我只是在回答你的直接问题;已经提到HostingEnvironment.MapPath()的可能是首选的解决方案。

于 2013-05-15T13:17:56.470 回答
0

回答这个问题有点晚了,但我们走了。

我可以使用 Environment.CurrentDirectory 解决这个问题

于 2020-11-16T22:57:38.833 回答
0

由于Server.MapPath()在 Web Api(Soap 或 REST)中不存在,因此您需要表示本地相对于 Web 服务器的上下文主目录。最简单的方法是:

string AppContext.BaseDirectory { get;}

然后,您可以使用它来连接路径字符串以将相对路径映射到任何文件。
注意:字符串路径\/mvc 中的不同。

前任:

System.IO.File.Exists($"{**AppContext.BaseDirectory**}\\\\Content\\\\pics\\\\{filename}");

返回 true- 假设这是您的示例中的合理路径

于 2019-07-14T18:47:23.137 回答
-1

你可以试试:

var path="~/Image/test.png"; System.Web.Hosting.HostingEnvironment.MapPath(@+path)

于 2019-02-12T08:35:49.437 回答
-1

所选答案在我的 Web API 应用程序中不起作用。我不得不使用

System.Web.HttpRuntime.AppDomainAppPath
于 2017-10-20T22:22:06.617 回答