SqlCommand cmd = new SqlCommand (
      "SELECT FileContents FROM AspContent " +
      "WHERE FileName=@fn", conn);
    cmd.Parameters.Add("@fn", fileName);
    contents = cmd.ExecuteScalar() as string;

    if (contents == null)
      contents = string.Empty;
  }
  catch
  {
    contents = string.Empty;
  }
  finally
  {
    conn.Close();
  }
  return contents;
}

Функция GetFileFromDB всего лишь получает имя файла из виртуального пути, а затем читает содержимое файла из базы данных. (Помните, что имя файла является первичным ключом в определенной базе данных, как показано на рис. 18.27.) Этот метод затем используется методами FileExists и GetFile, как показано в следующем фрагменте кода:

  public override bool FileExists(string virtualPath)
  {
    string contents = this.GetFileFromDB(virtualPath);
    if (contents.Equals(string.Empty))
      return false;
    else
      return true;
  }

  public override System.Web.Hosting.VirtualFile GetFile(string virtualPath)
  {
    string contents = this.GetFileFromDB(virtualPath);
    if (contents.Equals(string.Empty))
      return Previous.GetFile(virtualPath);
    else
      return new MyVirtualFile(virtualPath, contents);
  }
}

Как только вы вставите эту функцию в свой код, приложение будет готово к работе. Естественно, класс VirtualPathProvider работает для ресурсов, подключенных только с помощью ISAPI-расширения ASP.NET. Следовательно, если вы хотите использовать свои собственные расширения файлов в своем приложении, то сначала должны подключить это расширение с помощью ISAPI-расширения фильтра aspnet_isapi.dll. На рис. 18.28 показано приложение в действии. На рисунке показаны три броузера, один из которых пытается получить доступ к физическому файлу, другой — к файлу из базы данных, а третий — к ресурсу, доступ к которому закрыт и в базе данных, и в файловой системе.

предыдущая    следующая страница    вначало главы    оглавление

791

Hosted by uCoz