41

I am trying to read an XSLT file from disk in my ASP.Net MVC controller. What I am doing is the following:

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

However, half way down this thread on forums.asp.net there is the following quote

HttpContext.Current is evil and if you use it anywhere in your mvc app you are doing something wrong because you do not need it.

Whilst I am not using Current, I am wondering what is the best way to determine the absolute physical path of a file in MVC? For some reason (I don't know why!) HttpContext doesn't feel right for me.

Is there a better (or recommended/best practice) way of reading files from disk in ASP.Net MVC?

3 Answers 3

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

I disagree with the idea that HttpContext.Current is "evil." It's not the hammer for every problem, but it is certainly better than, e.g., Session for stuff that it can do OK.

Sign up to request clarification or add additional context in comments.

2 Comments

Ugh! Where is Url defined? I added System.Web.Mvc to my references (and using statements), but it is still not defined.
It's a property of Controller msdn.microsoft.com/en-us/library/…
15

If you're using WebApi or not specifically within a controller class, you can use the following as an alternative:

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

Comments

10

I would have the site root path injected into the controller constructor by the DI framework:

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");
    }
}

As far as the site root path is concerned it can be expressed with the HostingEnvironment.ApplicationPhysicalPath static property.

1 Comment

awesome idea!! People should be using more IoC in applications anyway in the .NET world...we don't use it enough.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.