Как сохранить файл XML на сервере IIS 7 с помощью ASP.NET

Итак, у меня есть проблема в моем приложении ASP.NET MVC, оно не хочет сохранять файл xml после его публикации. У меня есть форма, которую я отправляю в контроллер с помощью ajax, а затем использую эти данные для создания файла xml, который затем хочу сохранить.

Я использую следующий код для создания моего XML-файла и его сохранения:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(rawXml);
StreamWriter path = new StreamWriter(Server.MapPath("/"+ fileName + ".xml"));
xmlDoc.Save(path);

Если я запускаю свое приложение в режиме отладки, оно записывает файл в ~/MySolution/MyProject/MyFile, нет проблем.

Поэтому, когда я публикую приложение на сервере IIS 7 на своем компьютере и загружаю приложение через localhost/MyApp, я ожидаю, что оно запишет файл в C:\inetpub\wwwroot\MyApp\MyFile, но этого не происходит.

Я включил разрешения для папки inetpub и всех последующих папок для NETWORK SERVICE. Но сообщение AJAX продолжает возвращаться с ошибкой, и файл не появляется в папке, поэтому я предполагаю, что он не позволяет записать файл по указанному пути или путь неверен, так или иначе, я не знаю, как проверить что пошло не так.

Как заставить опубликованное приложение записать файл xml в путь C:\inetpub\wwwroot\MyApp\MyFile?


person Anton Toshik    schedule 11.09.2016    source источник
comment
Какую ошибку вы получаете обратно? Используйте инструменты F12, включите трассировку сети и посмотрите точное возвращаемое сообщение. Не зная ошибки, мы можем только догадываться, какова истинная причина.   -  person Mark Fitzpatrick    schedule 11.09.2016
comment
Почему бы просто не использовать System.IO.File для сохранения файла на диск? Зачем использовать XmlDocument, если все, что вы хотите сделать, это сохранить файл на диск, а не манипулировать или анализировать XML?   -  person mason    schedule 11.09.2016
comment
Какую ошибку вы получаете. ?   -  person Sukesh Marla    schedule 11.09.2016
comment
Я получаю отказ в доступе к пути «C:\inetpub\wwwroot\MyApp\MyFile.xml». 500 - внутренняя ошибка сервера). @mason Я не знаю, какие библиотеки лучше всего использовать и когда, извините, я взялся за всю эту веб-разработку только 2 месяца назад, может быть, у вас есть хорошие ресурсы?   -  person Anton Toshik    schedule 11.09.2016
comment
Создайте подкаталог MyApp для своих XML-файлов и предоставьте IIS_IUSERS доступ к нему для записи. Используйте этот подкаталог для записи файлов.   -  person Andrew Morton    schedule 11.09.2016


Ответы (1)


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

Я бы посоветовал вам добавить путь к вашему серверу в web.config, а затем получить его в своем коде. Используйте что-то вроде ниже в разделе настроек приложения web.config.

<add key="filePath" value="C:\inetpub\wwwroot\MyApp" />

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

Чтобы дополнительно узнать, какой конкретный пользователь (поскольку вариантов использования слишком много) используется w3wp, вы можете использовать монитор процесса, как описано ниже.

Захват журнала Process Monitor при воспроизведении проблемы

  1. Фильтровать отказ в доступе
  2. Нет отказа в доступе, поэтому отфильтруйте w3wp.exe
  3. Ищите доступ к 401-3.htm
  4. Просмотрите записи перед 401-3.htm, чтобы определить, к какому файлу обращались последним.
  5. Проверка разрешений на основе успешной операции QuerySecurityFile для последнего доступного файла (в данном случае это asp.dll)
person Ravi A.    schedule 11.09.2016