Таким образом, решение оказывается простым: вам нужно создать свою собственную реализацию класса 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

Hosted by uCoz