martsen
@martsen
Программист-дроновод

Как решить проблему с записью файла в папку приложения ASP.NET (IIS)?

Здравствуйте.

Столкнулся со следующей проблемой:
перестали записываться файлы в локальную папку приложения, которое хостится на IIS.

Архитектура приложения:
Приложение ASP.NET MVC 3, оно имеет несколько WCF сервисов. Один из них как раз предоставляет функционал загрузки файла. Клинтом этого сервиса является сильверлайт приложение. Через него происходит загрузка. Метод внутри клиента асинхронно дергает веб-сервис и дает ему пачками данные, которые должны записаться.

Я добавил новый веб-сервис в приложение, но после того как задеплоил новую версию перестал работать данный функионал. Откат на старую версию не помог.
Локально все трестируется и работает (как новая, так и старя версия).
При помощи логирования удалось выяснить, что не выполняет следущий кусок кода:
void SendFile()
{
	// какой-то код, действия которого можно отследить

	//Режимы открытия надо будет уточнить, но они не менялись уже много лет
	using (FileStream stream = File.Open(filename, FileMode.Append, FileAccess.Write, FileShare.Read))
	{
		// внуть using не передается управление, ничего нельзя отловить
		try
		{
			//
		}
		catch (Exception ex)
		{
			//
		}
	}
}


Падает, видимо, на создании потока. Подозрения на права на запись.
IIS 7, пул на .NET 4 вертится.

В логах IIS выдает ошибку 500. Пока подробнее получить нельзя из-за особенностей системы.

Можете подсказать куда копнуть? Права на IIS смотрели, все с виду ОК.
Позже могу дополнить ифнормацию.
  • Вопрос задан
  • 3114 просмотров
Решения вопроса 1
martsen
@martsen Автор вопроса
Программист-дроновод
Переписал код так, чтобы можно было словить ошибку. Выдало: System.IO.DirectoryNotFoundException: Could not find a part of the path

Нашлась куча интересных вопросов-ответов:
stackoverflow.com/questions/18740564/system-io-dir...
www.codeproject.com/Questions/658980/Could-not-fin...
support.microsoft.com/kb/827421

Решение:
Создавать вручную папку, куда будет записываться файл.

string dir = Path.GetDirectoryName(filePath);

if (!Directory.Exists(dir))
	Directory.CreateDirectory(dir);

FileStream stream = null;
try {
	stream = File.Open(filename, FileMode.Append, FileAccess.Write, FileShare.Read);
	....
}
	catch(Exception ... ) {
	...
}
finally {
	if(stream != null)
	stream.Dispose()
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Можно попробовать развернуть using и получить exception

FileStream stream = null;
try {
  stream = File.Open(filename, FileMode.Append, FileAccess.Write, FileShare.Read);
 ....
}
catch(Exception ... ) {
   ...
}
finally {
  if(stream != null)
     stream.Dispose()
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы