Провайдер ресурсів в ASP .NET (VirtualPathProvider)

Доброго вечора! Сьогодні, в цій коротенькій статті я продемонструю те, як ASP .NET дозволяє створити та підключити провайдера для контенту, який може повертати сторінки та інші ресурси з будь-якого джерела зберігання.

Наприклад уявіть, що у вас є сторінка, яка обов’язково має знаходитись не на сервері де розміщений ваш сайт, а в базі даних або в певному мережевому ресурсі. Використовуючи власний провайдер, ви можете якраз досягнути цього результату та віддати вміст файлу, який дійсно знаходиться десь інше.

Отже, нам потрібно створити власний клас, після чого унаслідувати його від VirtualPathProvider, і переписати методи GetFile та FileExists:


public class CustomProvider : VirtualPathProvider
{
   private string realPath = @"D:\RealFolder";
   public override bool FileExists(string virtualPath)
   {
      string physicPath = virtualPath.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
      string filePath = realPath + physicPath;
      return File.Exists(filePath);
   }

   public override VirtualFile GetFile(string virtualPath)
   {
      string physicPath = virtualPath.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
      string filePath = realPath + physicPath;
      return new RealFile(filePath, virtualPath);
   }
}

Тут я створив змінну, в якій зберігаю справжній шлях, де знаходяться всі потрібні файли сайту. Методи FileExists повертає ідентифікатор про те, чи файл існує, а GetFile повертає сам файл.

Як ви побачили, другий метод повертає файл, який має представлений класом VirtualFile. Цей клас є абстрактним, тому потрібно ще створити один клас, який його унаслідує:

public class RealFile : VirtualFile
{
   private string realPath;
   public RealFile(string path, string virtualPath) : base(virtualPath)
   {
      this.realPath = path;
   }
   public override Stream Open()
   {
      return new FileStream(this.realPath, FileMode.Open, FileAccess.Read, FileShare.Read);
   }
}

Нам потрібно лише реалізувати один метод – Open, який має повернути файл у вигляді потоку. В нашому випадку це FileStream.

Останнє, що залишилось зробити – це реєстрація цього провайдера. Я зробив це в файлі Global.asax в методі Application_Start:

void Application_Start(object sender, EventArgs e)
{
   // Code that runs on application startup
   HostingEnvironment.RegisterVirtualPathProvider(new CustomProvider());
}

Добавте будь-який файл у папку D:\RealFolder (наприклад html) та спробуйте до нього доступитись:

Мал. 1.1

Якщо ви хочете використовувати цього провайдера у комбінації зі стандартним, тоді в методах FileExists та GetFile поверніть значення попереднього провайдера, за допомогою властивості Previous:

private string realPath = @"D:\RealFolder";
public override bool FileExists(string virtualPath)
{
   string physicPath = virtualPath.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
   string filePath = realPath + physicPath;
   if (File.Exists(filePath))
      return true;
   else
      return Previous.FileExists(virtualPath);
}

public override VirtualFile GetFile(string virtualPath)
{
   string physicPath = virtualPath.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
   string filePath = realPath + physicPath;
   if (File.Exists(filePath))
      return new RealFile(filePath, virtualPath);
   else
      return Previous.GetFile(virtualPath);
}

Отже, це все, що потрібно для того щоб повертати файли з іншого джерела. Для додаткової інформації про VirtualPathProvider читайте MSDN. Smile

Advertisements

, , ,

  1. Leave a comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: