Microsoft Web API:如何执行Server.MapPath?
Microsoft Web API:如何执行Server.MapPath?
由于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"
问题的出现原因是需要在代码中获取文件的物理路径,以便进行文件操作。解决方法是使用HostingEnvironment.MapPath
方法来获取文件的物理路径。
在上述代码中,HostingEnvironment.MapPath
方法被用于获取~/example/file
文件的物理路径。在调试模式下,如果需要访问一个映射到\\example\file
的UNC共享文件,可以使用new FileStream(@"\\example\file", FileMode.Open, FileAccess.Read)
来获取文件流。
对于DNX core 5.0,HostingEnvironment
类已经不再使用。而是通过在Startup.cs
类的构造函数中注入IHostingEnvironment
接口来获取环境信息。具体代码如下:
public Startup(IHostingEnvironment env) { // 使用env对象获取环境信息 }
通过使用IHostingEnvironment
接口,可以在每个实例中控制环境,并使用#if
指令构建一个可以在多个环境中轻松部署的应用程序。
问题的出现原因是在某些情况下,如在静态方法中,无法使用System.Web对象(如HttpContext.Current)。在这种情况下,可以使用HostingEnvironment.MapPath方法来替代Server.MapPath方法。然而,由于HostingEnvironment是一个静态类实例,无法轻松进行模拟测试。
解决方法是在控制器或其他逻辑层中,依赖于自己的抽象层,例如IPathMapper接口。通过定义一个方法string MapPath(string virtualPath),将具体实现WebApi IPathMapper的路径映射功能委托给System.Web.Hosting.HostingEnvironment。在测试时,可以通过模拟重写GetWebPath方法来替代HostingEnvironment.MapPath方法。
然而,该方法在处理相对路径时(如../images/)可能存在问题。有用户提问是否可以通过使用HostingEnvironment来获取服务路径。