【问题标题】:Microsoft Web API: How do you do a Server.MapPath?Microsoft Web API:如何创建 Server.MapPath?
【发布时间】:2013-05-09 13:22:10
【问题描述】:

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

【问题讨论】:

    标签: asp.net-web-api


    【解决方案1】:

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

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

    另见What is the difference between Server.MapPath and HostingEnvironment.MapPath?

    【讨论】:

    • 这很好,但是没有简单的方法来模拟 HostingEnvironment,因为它是一个静态类实例...... :-(
    • 当然,但是在您的控制器或您想要测试的其他逻辑层中,您只需要依赖于您自己的抽象,例如IPathMapper(您可能会用一堆使用string MapPath(string virtualPath) 方法将其他问题纳入更大的工具带/实用程序界面)。只有WebApi IPathMapper 的具体实现需要了解System.Web.Hosting.HostingEnvironment
    • @JoshG - 您可以通过 Func GetWebPath = HostingEnvironment.MapPath 抽象 HostingEnvironment.MapPath,然后在测试时用模拟覆盖 GetWebPath。
    • 看起来像../images/这样的相对路径有问题
    • 它给出了控制器路径,那么我可以通过使用“HostingEnvironment”来获取服务路径吗?
    【解决方案2】:
    string root = HttpContext.Current.Server.MapPath("~/App_Data");
    

    【讨论】:

    • 你不想在 WebAPI 中使用 HttpContext.Current。自托管 API 怎么样?你不能依赖 HttpContext.Current 在那里。它也不适合测试。
    • 它不适合测试,这是正确的。但在自托管应用程序中仍然存在 HttpContext ;)
    【解决方案3】:

    除了那些偶然发现这一点的人之外,使用 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 映射,我发现这很有帮助。

    【讨论】:

    • 仅供参考,HostingEnvironment 类位于 System.Web.Hosting 命名空间中。
    • 对于 DNX 核心 5.0,HostingEnvironment 的替代品是什么?
    • 新的 Startup.cs 类现在在构造中注入一个公共 Startup(IHostingEnvironment env){},这个属性让我忘记了,前几天刚做了这个。这使您还可以控制每个实例的环境,并使用 #if 指令构建一个可以在多个环境中轻松跨层部署的应用程序。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      string AppContext.BaseDirectory { get;}
      

      然后您可以使用它来连接路径字符串以将相对路径映射到任何文件。
      注意:字符串路径是 \ 而不是 /,就像它们在 mvc 中一样。

      例如:

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

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

      【讨论】:

        【解决方案6】:

        回答有点晚了,但我们开始了。

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

        【讨论】:

        • 您能否添加更多关于您的解决方案与其他解决方案相比带来的内容以及您将如何实施它的示例?
        【解决方案7】:

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

        System.Web.HttpRuntime.AppDomainAppPath
        

        【讨论】:

        • 虽然这似乎是您获取 WebApi 应用程序路径的唯一方法,但这会为您提供应用程序的根目录,但不会将 ~\folder../images/ 等相对路径转换为物理路径路径
        【解决方案8】:

        你可以试试:

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

        【讨论】:

          猜你喜欢
          • 2015-12-02
          • 2023-01-27
          • 2014-11-23
          • 2023-03-28
          • 1970-01-01
          • 2012-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多