Nos últimos dias tive problemas ao usar HttpContext.Current.Server.MapPath em um Timer.
Neste caso, o problema é que o HttpContext.Current retorna null quando chamado pelo Timer.
Também já tive problemas de Server.MapPath em webservice quando usei HttpContext.Current.
O que é Server.MapPath?
Server.MapPath é o método que mapeia o caminho relativo ou virtual do diretório físico correspondente no servidor.
Abaixo vou listar algumas alternativas para resolver o problema de System.Web.HttpContext.Current.Server.MapPath.
//Mapeia um caminho virtual para um caminho físico no servidor.
System.Web.Hosting.HostingEnvironment.MapPath("/");
//Resultado: C:\inetpub\wwwroot\exemplo\
//Obtém o diretório base, o resolvedor de assembly usa para investigar os assemblies.
AppDomain.CurrentDomain.BaseDirectory;
//Resultado: C:\inetpub\wwwroot\exemplo\
//Obtém o caminho de unidade física de diretório de aplicativo hospedado no domínio do aplicativo atual.
HttpRuntime.AppDomainAppPath;
//Resultado: C:\inetpub\wwwroot\exemplo\