одновременное чтение и запись файлов изображений (asp.net, но относится к большинству веб-языков) - PullRequest
0 голосов
/ 04 января 2011

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

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

Проблема, которую я уже нахожу, заключается в том, что ASP.net иногда получает ошибку: он не может получить доступ к файлу, потому что он открыт для прав записи ботом. Аналогично, бот не может получить к нему доступ, потому что IIS передает его пользователю.

Бот использует io.streamwriter для сохранения данных в файл, а мой скрипт использует Response.WriteFile для отправки файла в скрипт. (Мне нужно использовать настоящую страницу ASP.net с типом содержимого JPG, который подает файл, чтобы убедиться, что только пользователи с активным сеансом могут просматривать JPG).

Мой вопрос: что является лучшим для этого? Я знаю, почему это происходит, но каково лучшее решение для этого? Будет ли разумнее хранить BLOB-объекты в базе данных, поскольку базы данных уже созданы для одновременного чтения / записи? Есть ли более простой способ сделать это с файлом, о котором я еще не подумал?

Заранее спасибо,

Энтони Греко

Ответы [ 2 ]

1 голос
/ 04 января 2011

Использование BLOB будет работать, если читатели используют модель изоляции SNAPSHOT (SQL Server 2005 и выше). См. Загрузка и выгрузка изображений с SQL Server через ASP.Net MVC , чтобы узнать, как передавать изображение из BLOB-объекта, и см. Понимание уровней изоляции на основе управления версиями строк для лекции по SNAPSHOT.

Но использование BLOB может быть излишним, вам может быть проще. Например, если у вас есть только один процесс ASP.Net, у вас может быть глобальная переменная volatile для текущего имени файла. Автор записывает JPG в новый файл, а затем обновляет глобальное «текущее» имя файла с помощью операции Interlocked.CompareExchange (это должно быть сравнение, потому что более новый писатель может на самом деле закончите быстрее, опередите предыдущего писателя, и вы хотите сохранить последнее обновление). Осталось решить некоторые проблемы (узнать имя файла при запуске, очистить старые файлы и т. Д.), Но все они довольно легко решаются.

Если у вас есть ферма серверов или несколько процессов ASP.Net, обслуживающих сайт, то все может быть сложно. Я бы все равно использовал вращающееся имя файла и использовал метод проб и ошибок (попробуйте ответить новым файлом, вернитесь к предыдущему более старому при обнаружении конфликта).

1 голос
/ 04 января 2011

Вы можете заставить бота записать данные в другое имя файла, а затем удалить и переименовать имя файла, обслуживаемого ASP.Net. Это должно сократить время блокировки файла до момента, когда произойдет удаление и переименование. Для уточнения:

  1. ASP.Net, обслуживающий изображение из "webcam.jpg"
  2. бот записывает данные изображения в «temp.jpg»
  3. когда записывается последний байт изображения, бот удаляет "webcam.jpg" и переименовывает "temp.jpg" в "webcam.jpg"

ASP.Net должен проверить, существует ли «webcam.jpg», если нет, подождать 10 мс (или подходящий небольшой шаг) и проверить еще раз.

...