«Не удалось найти часть пути» развертывание c # IIS в рабочей среде

#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"));