#c# #iis #file-io #iis-7.5
#c# #iis #файл-ввод-вывод #iis-7.5
Вопрос:
Я загружаю XML-файл из своего приложения:
XDocument.Load(HttpContext.Current.Server.MapPath("/") "XMLMetadata\Actions.1.xml");
В среде разработки он работает нормально.
Но после развертывания приложения система не может его найти.
в этом и заключается ошибка:
Exception Details: System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:inetpubwwwrootXMLMetadataActions.1.xml'.
файл был развернут в
C:inetpubwwwrootMyAppXMLMetadataActions.1.xml
и не для:
C:inetpubwwwrootXMLMetadataActions.1.xml
ПРИЛОЖЕНИЕ ASP .NET 4 MVC Чего мне не хватает?
Ответ №1:
Хм — вы хотите спросить, почему он развернут на C:inetpubwwwrootMyAppXMLMetadata
, а не C:inetpubwwwrootXMLMetadata
?
Как бы то ни было, вы ответили на причину, по которой вы получаете сообщение об ошибке.
Именно по этой причине вы пытаетесь использовать ссылочные URL-адреса, т.Е. ~XMLMetadata
Вместо жестко заданного местоположения.
Также убедитесь, что вы тестируете в системе разработки с использованием IIS локально.
Ответ №2:
Я почти уверен, что в этом случае вы хотите использовать «~». «~» используется с сервером.MapPath предоставит вам физический путь к корню приложения. Где как «/» даст вам физический путь к корню доменного имени. Эти пути могут отличаться в зависимости от того, как у вас настроен IIS.
XDocument.Load(HttpContext.Current.Server.MapPath("~") "XMLMetadata\Actions.1.xml");
Комментарии:
1. Это не сработает, он все равно будет разрешен для физического пути к корню, а не к виртуальному каталогу «MyApp».
2. Я думаю, что это все еще правильно, если его веб-сайт помечен как приложение в IIS. Я предполагаю, что это то, что происходит, поскольку кажется, что именно там выполняется его код, а пути различаются в разработке и производстве.
Ответ №3:
Трудно сказать, с какой именно структурой и базовым классом вы здесь работаете, но я предполагаю ASP.NET . Если это так, вы можете захотеть взглянуть на Control.ResolveUrl()
.
Затем вместо вашего вызова вы должны получить что-то вроде следующего Load()
.
XDocument.Load(this.ResolveUrl("~/XMLMetadata\Actions.1.xml"));
Ответ №4:
Я использовал что-то подобное в прошлом:
var appPath = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) HttpContext.Current.Request.ApplicationPath;
if (appPath.Substring(appPath.Length - 1, 1) != "/") appPath = appPath "/";
var filePath = appPath "XMLMetaData//Actions.1.xml";
Комментарии:
1. хотя, когда я перечитываю ваш пост, это, вероятно, не будет полезно.
Ответ №5:
Это связано с тем, что ваше веб-приложение находится в виртуальном каталоге, поэтому вам нужно будет перейти на этот уровень:
var applicationRoot =
HttpContext.Current.Server.MapPath(
HttpRequest.ApplicationPath);
Замечания по ApplicationPath из MSDN:
Используйте это свойство для создания URL-адреса относительно корня приложения со страницы или веб-пользовательского элемента управления, которого нет в корневом каталоге. Это позволяет страницам и общим элементам управления, существующим на разных уровнях структуры каталогов, использовать один и тот же код для ссылки на ресурсы в фиксированных расположениях в приложении.
Ответ №6:
XDocument.Load(HttpContext.Current.Server.MapPath("XMLMetadata/Actions.1.xml"));