Почему AppDomain.CurrentDomain.BaseDirectory не содержит "bin" в приложении asp.net?
У меня есть веб-проект, как:
namespace Web
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
lbResult.Text = PathTest.GetBasePath();
}
}
}
Метод PathTest.GetBasePath()
определяется в другом проекте, как:
namespace TestProject
{
public class PathTest
{
public static string GetBasePath()
{
return AppDomain.CurrentDomain.BaseDirectory;
}
}
}
Почему это дисплей ...\Web\
в то время как сборка TestProject компилируется в bin
папка (другими словами она должна отображать ...\Web\bin
в моей мысли).
Теперь у меня возникли проблемы, если я изменил метод в:
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();
}
}
}
File.config
создается в TestProject. Сейчас AppDomain.CurrentDomain.BaseDirectory + m_filePath
будет восстановлен ..\Web\File.config
(на самом деле файл был скопирован в ..\Web\bin\File.config
), будет выдано исключение.
Вы могли бы сказать, что я должен изменить m_filePath
в @"\bin\File.config"
, Однако, если я использую этот метод в консольном приложении в вашем предложении, AppDomain.CurrentDomain.BaseDirectory + m_filePath
вернусь ..\Console\bin\Debug\bin\File.config
(на самом деле файл был скопирован в .\Console\bin\Debug\File.config
), исключение будет выброшено из-за избытка bin
,
Другими словами, в веб-приложении AppDomain.CurrentDomain.BaseDirectory
это другой путь, куда файл должен быть скопирован (отсутствие /bin
), но в консольном приложении это один и тот же путь.
Кто-нибудь может мне помочь?
4 ответа
Согласно MSDN, домен приложения "представляет домен приложения, который является изолированной средой, в которой выполняются приложения". Когда вы думаете о приложении ASP.Net, корнем, в котором находится приложение, не является папка bin. Вполне возможно, а в некоторых случаях разумно, не иметь файлов в папке bin и, возможно, вообще нет папки bin. Поскольку AppDomain.CurrentDomain ссылается на один и тот же объект, независимо от того, вызываете ли вы код из кода позади или из DLL в папке bin, вы получите корневой путь к веб-сайту.
Когда я пишу код, предназначенный для запуска под приложениями asp.net и windows, обычно я создаю свойство, которое выглядит примерно так:
public static string GetBasePath()
{
if(System.Web.HttpContext.Current == null) return AppDomain.CurrentDomain.BaseDirectory;
else return Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"bin");
}
Другой (непроверенный) вариант будет использовать:
public static string GetBasePath()
{
return System.Reflection.Assembly.GetExecutingAssembly().Location;
}
Если вам нужно решение, которое работает для WinForms и веб-приложений
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
}
}
}
Приведенный выше фрагмент кода решения предназначен для расположения двоичных файлов.
AppDomain.CurrentDomain.BaseDirectory
все еще допустимый путь для веб-приложений, это просто корневая папка, в которой web.config
а также Global.asax
и такой же как Server.MapPath(@"~\");
Если вы используете AppDomain.CurrentDomain.SetupInformation.PrivateBinPath
вместо BaseDirectory
тогда вы должны получить правильный путь.
Когда ASP.net создает ваш сайт, он выводит сборочные сборки в специальном месте для них. Так что путь таким образом странный.
Для приложений, размещенных на asp.net, вы можете использовать:
string path = HttpContext.Current.Server.MapPath("~/App_Data/somedata.xml");