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\?

Respostas:


295

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

Não é necessário HttpContext.


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 !!


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


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.