Как эффективно добавить метаданные в произвольный файл в .NET? - PullRequest
1 голос
/ 20 марта 2011

Я строю сайт для шоппинга. Каждый проданный продукт может иметь несколько изображений, прикрепленных к нему, а также произвольные вложения (например, PDF с руководством и т. Д.). Эти ресурсы хранятся в нашей собственной системе ERP и доступны через удаленный API. На самом деле файл может находиться где угодно - в БД, на жестком диске, в сетевой папке и т. Д. API обеспечивает единый интерфейс доступа к нему.

Для повышения производительности я намерен кэшировать эти файлы на веб-сервере. Существует механизм счетчика версий, который позволяет мне эффективно определять, когда файл был изменен, и делать запись в кэше недействительной. Однако где я могу сохранить номер версии файла, который в данный момент находится в кеше? Кеш, по сути, представляет собой одну папку, к которой могут обращаться несколько рабочих процессов ASP.NET на веб-сервере. Для самого сайта нет БД - все данные поступают из ERP API.

В идеале это число должно храниться вместе с самим файлом. Чтобы при удалении файла (скажем, администратор решил очистить кэш для улучшения использования диска), метаданные не задерживались. Пока у меня есть две идеи:

  1. Запишите его в ADS (альтернативный поток данных). Нет простого способа получить к нему доступ через .NET. Библиотеки существуют, но я бы предпочел более элегантное решение (и я тоже не имею представления о производительности).
  2. Добавить его к самому файлу. Все известные мне форматы файлов довольно спокойно относятся к данным, добавляемым в файл. Но мне нужно будет удалить его перед передачей содержимого, и это будет означать, что я не смогу использовать встроенный TransmitFile - опять же меня беспокоит производительность.

Есть ли лучший способ?

Ответы [ 2 ]

3 голосов
/ 20 марта 2011

Если это просто номер версии, думали ли вы включить его в имя файла? Например:

foo.txt.v131

для версии 131 файла foo.txt. Одна приятная особенность этого подхода заключается в том, что вы можете писать новую версию (например, 132) файла, пока веб-сервер все еще может читать 131. Конечно, вам все равно придется проработать всю семантику свопинга. .

0 голосов
/ 20 марта 2011

Если вы знаете, что продукты меняются, то часто вы можете аннулировать кэш каждый час.

Более продвинутым способом было бы сохранить в версии БД значение CRC для каждого кэшированного файла.А затем запустите фоновую службу (например, через Cron), чтобы проверить, что файлы изменяются, а затем сделать недействительной.

...