在 asp.net mvc 中映射物理文件路径

Posted

技术标签:

【中文标题】在 asp.net mvc 中映射物理文件路径【英文标题】:Map the physical file path in asp.net mvc 【发布时间】:2011-02-19 13:36:32 【问题描述】:

我正在尝试从我的 ASP.Net MVC 控制器中的磁盘读取 XSLT 文件。我正在做的事情如下:

string filepath = HttpContext.Request.PhysicalApplicationPath;
filepath += "/Content/Xsl/pubmed.xslt";
string xsl = System.IO.File.ReadAllText(filepath);

但是,half way down this thread on forums.asp.net 有以下引用

HttpContext.Current 是邪恶的,如果你 在您的 mvc 应用程序中的任何地方使用它 做错事是因为你 不需要。

虽然我没有使用Current,但我想知道在 MVC 中确定文件的绝对物理路径的最佳方法是什么?出于某种原因(我不知道为什么!)HttpContext 不适合我。

在 ASP.Net MVC 中是否有更好(或推荐/最佳实践)从磁盘读取文件的方法?

【问题讨论】:

【参考方案1】:
string filePath = Server.MapPath(Url.Content("~/Content/Xsl/"));

我不同意HttpContext.Current 是“邪恶”的观点。它不是解决所有问题的锤子,但它肯定比 Session 更好。

【讨论】:

呃! Url 在哪里定义?我在引用中添加了System.Web.Mvc(和using 语句),但它仍然没有定义。 这是Controller msdn.microsoft.com/en-us/library/…的属性【参考方案2】:

如果您在控制器类中使用或未专门使用 WebApi,则可以使用以下替代方法:

HostingEnvironment.MapPath("/Content/Xsl/pubmed.xslt")

【讨论】:

【参考方案3】:

我会通过 DI 框架将站点根路径注入到控制器构造函数中:

public class HomeController: Controller

    private readonly string _siteRoot;
    public HomeController(string siteRoot)
    
        _siteRoot = siteRoot;
    

    public ActionResult Index()
    
        string filePath = Path.Combine(_siteRoot, @"Content\Xsl\pubmed.xslt");
        return File(filePath, "text/xml");
    

就站点根路径而言,它可以用HostingEnvironment.ApplicationPhysicalPath 静态属性表示。

【讨论】:

好主意!!无论如何,在 .NET 世界中,人们应该在应用程序中使用更多的 IoC……我们使用的不够多。

以上是关于在 asp.net mvc 中映射物理文件路径的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 4 (一)路径映射

ASP.NET MVC学习之路由篇

ASP.NET MVC 路由:绕过路径的静态文件处理程序

源码的说明 ASP.NET MVC 5框架揭秘.zip

asp.net中Server.MapPath是啥意思?

内容文件夹内文件的路径 (ASP.NET MVC)