Microsoft Web API:如何执行Server.MapPath?


239

由于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"

Answers:


469

您可以在任何对象都不可用的环境中使用HostingEnvironment.MapPath(例如,也可以使用静态方法)。System.WebHttpContext.Current

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

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


1
很好,但是没有简单的方法可以模拟HostingEnvironment,因为它是静态类实例... :-(
Josh G

6
当然可以,但是在您要测试的控制器或其他逻辑层中,您仅会依赖自己的抽象,例如IPathMapper(您可能会将其他一些问题汇总到更大的工具栏/实用程序界面中)用的方法string MapPath(string virtualPath)。只有您WebApi IPathMapper需要了解的具体实现System.Web.Hosting.HostingEnvironment
StuartLC

1
@JoshG-您可以通过Func <string,string> GetWebPath = HostingEnvironment.MapPath抽象HostingEnvironment.MapPath,然后在测试时使用模拟覆盖GetWebPath。
肖恩·B

看起来像是在相对路径方面遇到了麻烦../images/
AaA

它提供了控制器路径,因此我可以通过使用“ HostingEnvironment”获得服务路径吗?
阿斯兰医师

13
string root = HttpContext.Current.Server.MapPath("~/App_Data");

16
您不想在WebAPI中使用HttpContext.Current。自我托管的API呢?您不能依靠HttpContext.Current在那里。而且它不是测试友好的。
Trevor de Koekkoek 2014年

2

除了那些偶然发现的问题外,一种使用HostingEnvironment调用运行测试级别的好方法是,如果访问时说一个UNC共享:\ example \,它映射到〜/ 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

如果您有权在文件上进行本地测试,但是在生产中需要一次环境映射,我会发现这很有用。


仅供参考,HostingEnvironment该类在System.Web.Hosting名称空间中。
德莫(Dermot)2015年

2
HostingEnvironment DNX Core 5.0 的替代方案是什么?
roydukkey 2015年

现在,新的Startup.cs类在构造上注入了一个公共Startup(IHostingEnvironment env){},该属性让我无所适从,就在前几天。这样,您还可以控制每个实例的环境,并使用#if指令构建可轻松在多个环境中进行跨层部署的应用程序。
内森·蒂格

1

我无法从您提供的上下文中看出来,但是如果只是在应用程序启动时需要做的事情,您仍然可以Server.MapPath在中使用WebApiHttpApplication;例如在Application_Start()

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


0

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

string AppContext.BaseDirectory { get;}

然后,您可以使用它来连接路径字符串,以将相对路径映射到任何文件。
注:字符串路径\,而不是/像他们的MVC。

例如:

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

返回真实值,表明您的示例中这是一条声音路径


-1

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

System.Web.HttpRuntime.AppDomainAppPath

1
尽管这似乎是您获取WebApi应用程序路径的唯一方法,但这可以为您提供应用程序的根目录,但不会转换相对路径(例如~\folder../images/物理路径)
AaA

-1

您可以尝试像:

var path =“〜/ Image / test.png”; System.Web.Hosting.HostingEnvironment.MapPath(@ +路径)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.