«Не удалось найти часть пути» C # IIS развертывание на производстве - PullRequest
0 голосов
/ 27 октября 2011

Я загружаю 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:\inetpub\wwwroot\XMLMetadata\Actions.1.xml'.

файл был развернут в
C:\inetpub\wwwroot\MyApp\XMLMetadata\Actions.1.xml
, а не в:
C:\inetpub\wwwroot\XMLMetadata\Actions.1.xml

ASP .NET 4 MVC ПРИЛОЖЕНИЕ Чего мне не хватает?

Ответы [ 6 ]

1 голос
/ 27 октября 2011

Я почти уверен, что вы хотите использовать «~» в этом случае. «~», Используемый с Server.MapPath, даст вам физический путь к корню приложения. Где, как "/" даст вам физический путь к корню доменного имени. Эти пути могут отличаться в зависимости от настроек IIS.

XDocument.Load(HttpContext.Current.Server.MapPath("~") + "XMLMetadata\\Actions.1.xml"); 
1 голос
/ 27 октября 2011

Хмм. Вы хотите спросить, почему он развернулся на C:\inetpub\wwwroot\MyApp\XMLMetadata\, а не C:\inetpub\wwwroot\XMLMetadata\?

Вы уже ответили на причину, по которой вы получили ошибку.

Именно по этой причине вы пытаетесь использовать ссылочные URL, т.е. ~\XMLMetadata\, а не жестко закодированное местоположение.

Также убедитесь, что вы тестируете систему разработки с использованием IIS локально.

0 голосов
/ 27 октября 2011
XDocument.Load(HttpContext.Current.Server.MapPath("XMLMetadata/Actions.1.xml"));
0 голосов
/ 27 октября 2011

Это связано с тем, что ваше веб-приложение находится в виртуальном каталоге, поэтому вам нужно разрешить до этого уровня:

var applicationRoot = 
    HttpContext.Current.Server.MapPath(
        HttpRequest.ApplicationPath);

Замечания по ApplicationPath от MSDN :

Используйте это свойство для создания URL-адреса относительно корня приложения со страницы или пользовательского веб-элемента управления, который не находится в корневом каталоге.Это позволяет страницам и общим элементам управления, которые существуют на разных уровнях структуры каталогов, использовать один и тот же код для ссылки на ресурсы в фиксированных местах приложения.

0 голосов
/ 27 октября 2011

Я использовал что-то подобное в прошлом:

    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";
0 голосов
/ 27 октября 2011

Трудно сказать, с какой именно структурой и базовым классом вы здесь работаете, но я предполагаю, что ASP.NET. Если это так, вы можете взглянуть на Control.ResolveUrl().

Затем вы должны получить что-то вроде следующего вместо Load() звонка.

XDocument.Load(this.ResolveUrl("~/XMLMetadata\\Actions.1.xml"));
...