Таким образом, решение оказывается простым: вам нужно создать свою собственную реализацию класса VirtualFile и переопределить метод Open. Этот метод затем вернет поток в инфраструктуру ASP.NET, которая фактически вернет содержимое вашего файла базы данных. Ниже показана реализация простого класса VirtualFile:
public class MyVirtualFile : System.Web.Hosting.VirtualFile
{
private string _FileContent;
public MyVirtualFile(string virtualPath, string fileContent)
: base(virtualPath)
{
_FileContent = fileContent;
}
public override Stream Open()
{
Stream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream, Encoding.Unicode);
writer.Write(_FileContent);
writer.Flush();
stream.Seek(0, SeekOrigin.Begin);
return stream;
}
}
Конструктор класса получает виртуальный путь и содержимое файла. В методе Open строка с фактическим содержимым сохраняется в MemoryStream, и этот поток затем возвращается. ASP.NET использует поток для чтения содержимого так, будто бы оно было прочитано из файловой системы — это возможно благодаря абстракции байтов посредством класса Stream.
Следующий шаг заключается в завершении класса VirtualPathProvider. Он должен прочитать актуальные данные для файлов из базы данных. Если файла нет в базе данных, поставщик просто направляет запрос его предыдущему поставщику (который был выбран инфраструктурой при регистрации в статическом методе Applnitialize). Добавьте метод для получения содержимого из базы данных в класс MyProvider, представленный ранее:
private string GetFileFromDB(string virtualPath)
{
string contents;
string fileName = virtualPath.Substring(virtualPath.IndexOf('/', 1) +1);
// Читаем файл из базы данных
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "data source=(local);Integrated " +
"Security=SSPI;initial catalog=AspContent";
conn.Open();
try
{
предыдущая следующая страница вначало главы оглавление
790