Como posso usar Server.MapPath () de global.asax?

122

Preciso usar Server.MapPath()para combinar alguns caminhos de arquivos que guardo no web.config.

No entanto, como Server.MapPath()conta com o HttpContext atual (acho), não consigo fazer isso. Ao tentar usar o método, mesmo que esteja "disponível", recebo a seguinte exceção:

A operação do servidor não está disponível neste contexto.

Existe outro método que pode mapear um diretório relativo da raiz da web, como ~/App_Data/para o caminho físico completo, como C:\inetpub\wwwroot\project\App_data\?

John Bubriski
fonte

Respostas:

295

Você pode tentar System.Web.Hosting.HostingEnvironment.MapPath () .

Não é necessário HttpContext.

Março de Corbin
fonte
Alguma advertência para esta técnica?
John Bubriski
10
Não. Se você iniciar o Reflector, notará que Server.MapPath e Request.MapPath finalmente chamam VirtualPath.MapPath, que finalmente chama HostingEnvironment.MapPath. Todos eles terminam no mesmo lugar. HostingEnvironment.MapPath interrompe o intermediário.
março
1
O +1 corrigiu um projeto de código aberto que estava funcionando para mim e parou de inicializar devido ao HttpContext.Current.Server explodir por não ter um contexto por algum motivo. Mudar para isso coloca-o de volta à navegação suave.
precisa saber é o seguinte
4

Use AppDomain.CurrentDomain.BaseDirectoryporque Contextpode retornar nulo !!

Kiran Banda
fonte
1

Quando em Global.asax, use o objeto de contexto :

context.Server.mappath ()

O contexto permite acessar também a coleção de sessões, o objeto de solicitação e o objeto de resposta. Muito útil quando você deseja registrar erros, por exemplo

tekBlues
fonte
Não há garantia Contextno Global.asax.
Anders Tornblad
-3

Você pode tentar o HttpContext.Current.Server.MapPath ("/") - Foi assim que eu o referenciei antes nas aulas.

VoltaicShock
fonte
2
Você pode referenciá-lo assim em classes que realmente têm um HttpContext, mas não acho que global.asax tenha um, daí a mensagem de erro que recebi.
John Bubriski