ASP.NET Core: Replacement for Server.MapPath

There’s no Server.MapPath() in ASP.NET Core and things are way different than with old ASP.NET MVC. This blog post shows how application and public web files are organized in ASP.NET Core and how to access them from web applications.

ASP.NET Core offers two different locations for files:

  • Content root – this is where application binaries and other private files are held.
  • Web root – this is where public files are held (wwwroot folder in web project).

By default web root is located under content root. But there are also deployments where web root is located somewhere else. I have previously seen such deployments on Azure Web Apps. It’s possible that some ISP-s also use different directories in tree for application files and web root.

Getting content and web root at code

Paths to content root and web root are available through IHostingEnvironment in code like shown here.

ASP.NET Core: Content root and web root may have different locations

Notice how content root and wwwroot are located in totally different places in machine.

Setting web root location

To set location for web root we need hosting.json file in application root folder. Also we need some code to include the file – at least for Kestrel. My hosting.json is shown here.

{
  "webRoot": "c:\\temp\\wwwroot\\"
}

It is loaded when program starts (Program.cs file). I made this file optional so my application doesn’t crash when hosting file is missing.

public class Program
{
    public static void Main(string[] args)
    {
        var config = new ConfigurationBuilder()
                         .AddJsonFile("hosting.json", optional: true)
                         .Build();

        CreateWebHostBuilder(args).UseConfiguration(config)
.UseKestrel()
.Build()
.Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

If there is no hosting file then default configuration is used and ASP.NET Core expects that web root is located under application content root.

Wrapping up

Although we don’t have Server.MapPath() call anymore in ASP.NET we have IHostingEnvironment that provides us with paths to application content root and web root. These are full paths to mentioned locations and not URL-s. We can use these paths to read files from both of locations if needed.

Gunnar Peipman

Gunnar Peipman is ASP.NET, Azure and SharePoint fan, Estonian Microsoft user group leader, blogger, conference speaker, teacher, and tech maniac. Since 2008 he is Microsoft MVP specialized on ASP.NET.

    Leave a Reply

    Your email address will not be published. Required fields are marked *