41

我正在尝试从我的 ASP.Net MVC 控制器中的磁盘读取 XSLT 文件。我正在做的是以下内容:

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

但是,在 forums.asp.net 上的这个线程的中途有以下引用

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

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

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

4

3 回答 3

76
string filePath = Server.MapPath(Url.Content("~/Content/Xsl/"));

我不同意HttpContext.Current“邪恶”的想法。它不是解决所有问题的锤子,但对于它可以做的事情来说,它肯定比 Session 更好。

于 2010-05-14T14:40:35.890 回答
15

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

HostingEnvironment.MapPath("/Content/Xsl/pubmed.xslt")
于 2015-05-06T00:50:13.717 回答
10

我会让 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静态属性来表示。

于 2010-05-15T08:13:44.027 回答