2011-12-29 37 views
20

Tengo un proyecto web como:¿Por qué AppDomain.CurrentDomain.BaseDirectory no contiene "bin" en la aplicación asp.net?

namespace Web 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      lbResult.Text = PathTest.GetBasePath(); 
     } 
    } 
} 

se define la forma PathTest.GetBasePath() en otro proyecto como:

namespace TestProject 
{ 
    public class PathTest 
    { 
     public static string GetBasePath() 
     { 
      return AppDomain.CurrentDomain.BaseDirectory; 
     } 
    } 
} 

Por qué vale la pantalla ...\Web\ mientras que el conjunto TestProject se compila en bin carpeta (en otras palabras debería mostrar ...\Web\bin en mi pensamiento).

Ahora tengo un problema si he modificado el método en:

namespace TestProject 
{ 
    public class FileReader 
    { 
     private const string m_filePath = @"\File.config"; 
     public static string Read() 
     { 
      FileStream fs = null; 
      fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + m_filePath,FileMode.Open, FileAccess.Read); 
      StreamReader reader = new StreamReader(fs); 
      return reader.ReadToEnd(); 
     } 
    } 
} 

El File.config se crea en TestProject. Ahora AppDomain.CurrentDomain.BaseDirectory + m_filePath returen ..\Web\File.config (en realidad el archivo se copió en ..\Web\bin\File.config), se lanzará una excepción.

Se podría decir que debería modificar m_filePath a @"\bin\File.config". Sin embargo, si utilizo este método en una aplicación de consola en su sugerencia, AppDomain.CurrentDomain.BaseDirectory + m_filePath devolverá ..\Console\bin\Debug\bin\File.config (en realidad el archivo se copió en .\Console\bin\Debug\File.config), se lanzará una excepción debido al excedente bin.

En otras palabras, en la aplicación web, AppDomain.CurrentDomain.BaseDirectory es una ruta diferente donde se copia el archivo (falta de /bin), pero en la aplicación de la consola es la misma ruta.
¿Alguien me puede ayudar?

+0

La base de una aplicación web es la raíz web donde se encuentran las páginas ASPX. La carpeta bin es solo una subcarpeta de la raíz. – Tejs

+0

¡Uf! ¡Pensé que me había vuelto loco! Tuve el mismo problema ... – ECC

Respuesta

28

Por MSDN, un dominio de aplicación "Representa un dominio de aplicación, que es un entorno aislado donde se ejecutan las aplicaciones." Cuando piensas en una aplicación ASP.Net, la raíz donde reside la aplicación no es la carpeta bin. Es totalmente posible, y en algunos casos razonable, no tener archivos en su carpeta bin, y posiblemente ninguna carpeta bin en absoluto. Como AppDomain.CurrentDomain hace referencia al mismo objeto, independientemente de si llama al código desde el código o desde un dll en la carpeta bin, terminará con la ruta raíz al sitio web.

Cuando he código diseñado para ejecutarse en tanto asp.net y ventanas escrito apps de por lo general creo una propiedad que se ve algo como esto:

public static string GetBasePath()   
{  
    if(System.Web.HttpContext.Current == null) return AppDomain.CurrentDomain.BaseDirectory; 
    else return Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"bin"); 
} 

Otra opción (no probado) sería utilizar:

public static string GetBasePath()   
{  
    return System.Reflection.Assembly.GetExecutingAssembly().Location; 
} 
+0

una buena solución, pero no responde por qué ... quizás no haya una buena respuesta. – kenny

+0

@kenny - Actualizado con un poco de información – Peter

+1

¡Su respuesta es muy clara y útil, muchas gracias! –

14

Si usa AppDomain.CurrentDomain.SetupInformation.PrivateBinPath en lugar de BaseDirectory, debe obtener la ruta correcta.

+1

Nota, de acuerdo con MSDN PrivatBinPath puede ser una secuencia de carpetas delimitada por coman. http://msdn.microsoft.com/en-us/library/system.appdomainsetup.privatebinpath.aspx – Peter

+0

+1 Esta es de lejos la mejor respuesta @Peter FWIW en la práctica, no parece a partir de mis observaciones. No estoy listo para llamarlo un error de doc completo aunque –

+0

funciona bien gracias – Neo

2

Cuando ASP.net crea su sitio, genera conjuntos de construcción en su lugar especial. Entonces, obtener el camino de esa manera es extraño.

Para asp.aplicaciones de red alojada puede utilizar:

string path = HttpContext.Current.Server.MapPath("~/App_Data/somedata.xml"); 
9

En caso de que quiera una solución que funciona para Windows Forms y aplicaciones web

public string ApplicationPath 
    { 
     get 
     { 
      if (String.IsNullOrEmpty(AppDomain.CurrentDomain.RelativeSearchPath)) 
      { 
       return AppDomain.CurrentDomain.BaseDirectory; //exe folder for WinForms, Consoles, Windows Services 
      } 
      else 
      { 
       return AppDomain.CurrentDomain.RelativeSearchPath; //bin folder for Web Apps 
      } 
     } 
    } 

Por encima de fragmento de código solución es que los lugares binarios

El AppDomain.CurrentDomain.BaseDirectory sigue siendo una ruta válida para las aplicaciones web, es solo una carpeta raíz donde web.config y Global.asax y es igual que Server.MapPath(@"~\");

Cuestiones relacionadas