Uso de Server.MapPath en clases externas de C # en ASP.NET


132

Estoy tratando de obtener la ruta absoluta de ciertos archivos en una clase de C #. Server.MapPathfunciona muy bien, por supuesto, para ASPX y sus páginas de código subyacente, pero eso no existe en otro archivo de clase. Lo intenté HostingEnvironment.MapPath(), pero eso se queja de que la ruta virtual relativa no está permitida. ¿Alguna idea?

System.Web ya está importado

Respuestas:


302

La ServerUtilityclase está disponible como una instancia en su HttpContext. Si se encuentra en un entorno donde sabe que se ejecutará dentro de la tubería ASP.Net, puede usar

HttpContext.Current.Server.MapPath()

Sin System.Webembargo, tendrás que importar .


1
Aunque esta publicación tiene más de 2 años, me has ayudado enormemente. Gracias.
iarwain01

66
¿Qué pasa si no se ejecuta en esa tubería?
zaitsman

Si no está ejecutando dentro de ASP.Net, entonces es poco probable que su HttpContext se esté configurando, a menos que haya escrito su propia tubería :) Tendrá que confiar en los métodos que proporciona su contexto de ejecución (enrutador?). Si su proceso tiene una idea de los conceptos básicos de su enrutamiento de ruta, puede echar un vistazo a los métodos System.IO.Path.
womp

Este compilado pero el contexto es nulo fuera de los controladores, por lo que mis errores de código. Creo que womp dice lo mismo allí. Si ese es el caso, ¿puede acceder a MapPath fuera de los enrutadores?
edencorbin

34

también puedes usar:

var path = System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/myfile.txt")

Si

var path = Server.MapPath("~/App_Data");
var fullpath = Path.Combine(path , "myfile.txt");

es inaccesible


8

¿No puede simplemente agregar una referencia System.Weby luego puede usar Server.MapPath?

Editar: hoy en día recomendaría usar el HostingEnvironment.MapPathMétodo :

Es un método estático en System.Webensamblado que asigna una ruta virtual a una ruta física en el servidor. Que no requiere una referencia a HttpContext.


No en clases externas.
funwhilelost

Claro que puede agregar la referencia a una clase externa; pero obviamente necesita usarlo en el contexto de una solicitud del servidor para que HttpContext no sea nulo.
Dan Diplo

4
System.Reflection.Assembly.GetAssembly(type).Location

SI el archivo que está intentando obtener es la ubicación del ensamblaje de un tipo. Pero si los archivos son relativos a la ubicación del ensamblaje, puede usar esto con el System.IOespacio de nombres para obtener la ruta exacta del archivo.


-1: ¿Qué te llevó a creer que quería la ubicación de una asamblea?
John Saunders

1
Dijo que "ciertos archivos" no especificó la ubicación o la naturaleza de los archivos, por lo tanto, conocer la ubicación del ensamblaje y poder trabajar en relación con esa ruta puede ser útil. Por supuesto, si él realmente dijo que todavía estaba en un HttpContext, entonces no me habría molestado en responder.
David McEwing

David McEwing, lo que sugieres no funcionará porque IIS no carga los ensamblajes desde la ubicación en la que los instalas, en el sitio web. Se copian y cargan desde una ubicación temporal de caché asp.net, por lo que al hacer un GetAssembly o GetExecutingAssembly le indicará la ubicación del ensamblado, pero no tendría nada que ver con la ubicación del sitio web al que apunta MapPath.
zumalifeguard


3
class test
{
public static void useServerPath(string path)
{
   if (File.Exists(path)
{
 \\...... do whatever you wabt
}
else
{
\\.....
}
}

Ahora cuando llamas al método desde el código detrás

por ejemplo :

protected void BtAtualizacao_Click(object sender, EventArgs e)
        {
             string path = Server.MapPath("Folder") + "\\anifile.txt";

            test.useServerPath(path);
}

de esta manera su código es simple y con un método puede usar múltiples rutas para cada llamada :)


3

Este me ayudó

//System.Web.HttpContext.Current.Server.MapPath //        
FileStream fileStream = new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/File.txt"),
FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);

Bienvenido a stackoverflow. Un poco más de explicación ayudaría a los compañeros programadores a comprender por qué la solución funcionó.
NJInamdar

1

Ya sea que esté ejecutando en el contexto de ASP.NET o no, debería poder usar HostingEnvironment.ApplicationPhysicalPath


0

Server.mappath ("") funcionará en la página aspx, si desea obtener la ruta absoluta de un archivo de clase, debe usar esto:

HttpContext.Current.Server.MapPath("~/EmailLogic/RegistrationTemplate.html")
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.