Server.MapPath не работает

Я впервые пытаюсь получить доступ к файлам в виртуальном каталоге, созданном в IIS, но получаю странные результаты.

ОС: Windows XP Pro

IIS: 5.1

Платформа разработки: Visual Studio 2008

Язык: C #

Имя виртуального каталога: портал

Локальный путь: C: \ digital_communications_report_portal

Локальный путь веб-сайта по умолчанию: c: \ inetpub \ wwwroot

Я могу без проблем загрузить файл с http://localhost/portal/testFile.xlsx.

Я пробую любой из этих

string realFilename = Server.MapPath(ResolveUrl("~/portal/testFile.xlsx"));
string realFilename = Server.MapPath(ResolveUrl("localhost/portal/testFile.xlsx"));

и получите "C: \ Documents and Settings \ jjohnson \ My Documents \ Visual Studio 2008 \ WebSites \ clientsite \ localhost \ portal \ testFile.xlsx", который является моим путем к проекту с виртуальным путем, наложенным на конце, и не является допустимым путем . Я пытаюсь использовать тильду или localhost и получаю сообщение «Не удалось сопоставить путь '/portal/testFile.xlsx'». исключение.

Есть идеи, что я делаю не так?


person Jeremy    schedule 10.09.2010    source источник


Ответы (1)


Если я не ошибаюсь, Server.MapPath(ResolveUrl("~/relative/path/to/file")) - это не то, что вам нужно. Будет создано /rooted/path/to/file, которое при передаче в Server.MapPath() не даст допустимого местоположения.

Вместо этого просто используйте Server.MapPath("~/relative/path/to/file");

Обновлять

Проблема, с которой вы столкнулись, связана с тем, что вы включаете имя виртуального каталога («портал») в свой относительный URL-адрес. Ваш относительный URL-адрес не должен указывать имя виртуального каталога, только путь к желаемому файлу относительно корня приложения.

person Nathan Taylor    schedule 10.09.2010
comment
Это по-прежнему дает мне те же результаты, что и resolurl ... C: \ Documents and Settings \ jjohnson \ My Documents \ Visual Studio 2008 \ WebSites \ clientsite \ localhost \ portal \ testFile.xlsx - person Jeremy; 10.09.2010
comment
@Jeremy См. Мой обновленный ответ. Проблема в том, что вы указываете имя виртуального каталога в относительном URL-адресе, чего не должно быть. Я только что протестировал и подтвердил это на своей собственной системе. - person Nathan Taylor; 10.09.2010
comment
@ Натан, большое спасибо за терпение, но у меня все еще проблемы. Если я правильно вас понял, если я хочу перейти в папку / portal / help_desk (где портал - это мой виртуальный каталог), я бы посмотрел на Server.MapPath (~ / help_desk); но когда я это делаю, я получаю C: \\ Inetpub \\ clientsite \\ help_desk, который является путем к проекту с застрявшим на конце help_desk, когда я пытаюсь добраться до C: \ digital_communications_report_portal \ help_desk (корневая папка находясь там, где указывает портал). - person Jeremy; 13.09.2010
comment
Я вам скажу, что пытаюсь сделать ... Я пытаюсь отобразить папки и файлы в виртуальном каталоге. Папки должны быть ссылками, ведущими вниз к дочерним папкам, а файлы должны быть ссылками для загрузки. Теоретически я щелкаю папку help_desk и с помощью объекта DirectoryInfo получаю список папок в help_desk и с помощью объекта FileInfo получаю testFile.xlsx. Все члены этих двух объектов назначаются тегу гиперссылки. У меня все функциональные возможности работают локально, но когда я пытаюсь запустить его через IIS в качестве виртуального каталога, у меня возникают проблемы. - person Jeremy; 13.09.2010
comment
@Jeremy Испытываете ли вы те же трудности, если выполняете приложение в невиртуальном каталоге, то есть в корне вашего веб-сервера? - person Nathan Taylor; 13.09.2010
comment
Нет локально, все работает нормально ... если бы я работал локально, приложение готово! К сожалению, мне не так повезло. :) - person Jeremy; 13.09.2010
comment
Незначительное обновление: я возился с Server.UrlPathEncode и смог жестко закодировать ссылку, которая попадает в testFile.xlsx для загрузки. Это работает. Итак, моя проблема, похоже, связана только с физическим путем для навигации по файлам и каталогам через DirectoryInfo и FileInfo. Вот где у меня, похоже, проблема с Server.MapPath. - person Jeremy; 13.09.2010
comment
Незначительное обновление 2: строка folderPath = Server.MapPath (/ portal); DirectoryInfo di = новый DirectoryInfo (folderPath); фактически переводит меня в нужную папку. {C: \ digital_communications_report_portal} база {System.IO.FileSystemInfo}: {C: \ digital_communications_report_portal} Существует: true Имя: digital_communications_report_portal Родитель: {} Корень: {C: \} Однако di.GetDirectories () дает доступ к пути 'C: \ digital_communications_report_portal' отклонен. И когда я меняю folderPath на portal / help_desk и проверяю di.exists, он говорит false, хотя я знаю, что он там. - person Jeremy; 13.09.2010
comment
@ Натан, похоже, последней частью головоломки были разрешения на доступ к папке. Я добавил aspnet в папку как пользователь, и, похоже, все в порядке. Большое вам спасибо за вашу помощь, руководство и терпение. - person Jeremy; 13.09.2010
comment
@ Джереми, я рад, что ты это понял, не думаю, что я бы догадалась об этом! - person Nathan Taylor; 13.09.2010