Доступ к виртуальному каталогу (подключенному диску) через веб-страницу c # / asp.net с помощью IIS7

Итак, у меня есть сервер A и сервер B.

Сервер A: Windows Server 2008 R2 Сервер B: Windows Server 2003

Веб-страница использует фреймворк 4.0, созданный с помощью VS2013 Pro RC

на сервере A моя веб-страница asp.net/c# работает на IIS7 на сервере B У меня есть общая папка.

Теперь я сопоставил эту общую папку с сервера B на сервер A, и она полностью доступна через Desktop \ Windows Explorer, однако доступ к папке с веб-страницы - это другая история.

Чтобы получить доступ к папке, то, что я сделал в IIS7, - это создать виртуальную папку на той же веб-странице и указать ее на подключенный диск.

Это, конечно, сработало бы, если бы папка находилась на том же сервере A, но поскольку она находится на другом сервере B, я получаю следующую ошибку.

Не удалось найти часть пути 'L: \ a \ b \ file.pdf', теперь путь на 100% правильный, так как я проверил.


Вот дополнительная информация об отладке:

Не удалось найти часть пути 'L: \ a \ b \ file.pdf'.

Описание: необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительных сведений об ошибке и ее происхождении в коде.

Сведения об исключении: System.IO.DirectoryNotFoundException: не удалось найти часть пути 'L: \ a \ b \ file.pdf'.

Ошибка источника:

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

Трассировки стека:

[DirectoryNotFoundException: не удалось найти часть пути 'L: \ a \ b \ file.pdf'.] System.IO .__ Error.WinIOError (Int32 errorCode, String mightFullPath) +216 System.IO.FileStream.Init (String путь, режим FileMode, доступ к файлу, права Int32, логические права использования, общий ресурс FileShare, Int32 bufferSize, параметры FileOptions, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath) +2481 System.IO.FileStream..ctor (путь к файлу, String путь, режим, доступ к FileAccess, общий ресурс FileShare, Int32 bufferSize, параметры FileOptions, String msgPath, Boolean bFromProxy) +229
System.IO.FileStream..ctor (путь String, режим FileMode, доступ к FileAccess, общий ресурс FileShare) +102
System.Web.HttpResponse.WriteFile (имя файла String, логическое readIntoMemory) +166 Reloc.Client.Contracts.openLinkClick (отправитель объекта, EventArgs e) в c: \ Users \ x \ Documents \ Visual Studio 2013 \ Projects \ p \ p \ S \ Listdoc.aspx.cs: 230
System.Web.UI.WebControls.GridView.HandleEven t (EventArgs e, логические причиныValidation, String validationGroup) +1192
System.Web.UI.WebControls.GridViewRow.OnBubbleEvent (источник объекта, EventArgs e) +164 System.Web.UI.Control.RaiseBubbleEvent (источник объекта, EventArgs args) +52
System.Web.UI.Page.ProcessRequestMain (логическое includeStagesBeforeAsyncPoint, логическое includeStagesAfterAsyncPoint) +3707


Я полагаю, что это могло иметь какое-то отношение к разрешению или связанное с этим, я пробовал множество вещей, но безуспешно. Так что, пожалуйста, помогите мне здесь. Заранее спасибо.


person Mana    schedule 22.11.2013    source источник


Ответы (3)


Как предлагает wata, каждый пользователь получает свои собственные подключенные диски. Это означает, что ваш диск L: не совпадает с диском L: вашей учетной записи пула приложений.

Кроме того, если вы не изменили учетную запись, под которой работает пул приложений, он не сможет получить доступ к общей папке на другом сервере. Скорее всего, вы входите на оба сервера, используя учетную запись домена Active Directory. Если это так, вы, вероятно, захотите создать новую учетную запись домена Active Directory для использования в качестве удостоверения для вашего пула приложений. Вы можете изменить удостоверение пула приложений, чтобы использовать свою учетную запись домена для целей разработки / тестирования, но это не рекомендуется для обеспечения безопасности в производственной системе.

После того, как вы создали новую учетную запись службы Active Directory (чтобы избежать неприятностей в будущем, убедитесь, что срок действия пароля не истекает), вы захотите изменить удостоверение пула приложений в IIS. Перейдите в Пулы приложений, найдите пул приложений, используемый вашим сайтом, выберите его и выберите «Расширенные настройки» справа, перейдите в «Удостоверение» и нажмите кнопку ..., чтобы настроить пользовательскую учетную запись, не забудьте указать перед именем пользователя префикс доменное имя: mydomain \ myserviceusername.

Вы также захотите предоставить своей учетной записи службы доступ к общему ресурсу Сервера B.

Теперь вам нужно будет создать постоянный подключенный диск с сервера A на сервер B, используя свою учетную запись службы. Подробнее см. this, не забудьте настроить сценарий, который переназначает диск после перезагрузки с помощью такой команды, как net use L: \\ServerB\sharedfolder /persistent:yes, убедитесь, что он запущен как ваша учетная запись службы. Вы могли бы даже запустить это первое действие в своем приложении Global.asax.cs Application_Start. Если вы хотите избежать хлопот, описанных в этом абзаце, воспользуйтесь предложением wata об использовании полного пути UNC вместо подключенного диска.

Теперь ваше веб-приложение должно иметь доступ к общей папке на сервере B. :-)

person Oran Dennison    schedule 27.11.2013
comment
Спасибо за подробное объяснение, прояснившее выделение, и я думаю, что скоро он заработает, просто ожидая некоторых разрешений от администратора. - person Mana; 27.11.2013

Проблема в том, что если вы создаете подключенный диск, он виден только пользователю, который его создал. Поскольку пул приложений IIS вашего приложения, вероятно, работает под другим пользователем, этот подключенный диск для него невидим. (Запуск приложения под другой учетной записью пользователя является хорошей практикой безопасности)

Я предлагаю следующее: вместо использования подключенного диска для виртуального каталога попробуйте использовать путь UNC. Например: создайте виртуальный каталог с именем «документы», который сопоставляется с \\ ServerB \ a \ b. После этого вы сможете получить доступ к своему файлу с помощью «documents / file.pdf». Имейте в виду, что пользователь пула приложений IIS приложения должен иметь доступ к общему сетевому ресурсу \\ ServerB \, а также к нужным подпапкам и файлам.

person wata    schedule 25.11.2013
comment
Для тех, кому нужно найти UNC (универсальное соглашение об именах) подключенного диска, введите net use в командной строке для stackoverflow.com/questions/21482825/ - person Tony L.; 14.08.2015

Проверьте права доступа к папке на сервере и убедитесь, что пул приложений сайта имеет к ней доступ.

person user3021132    schedule 22.11.2013
comment
Можете ли вы сказать мне, как я могу дать разрешение на пул приложений на сайте, или порекомендуйте мне кое-что, где я могу прочитать об этом? - person Mana; 22.11.2013
comment
ты про разрешения на расшаренную папку? и должен ли я изменить разрешения на сервере A или B - person Mana; 22.11.2013