我创建了一个 VirtualPathProvider 来读取部分视图(来自 Azure 存储),但是当我到达希望 VirtualPathProvider 去寻找视图的页面(在 Azure 存储中)时,它不会调用 GetFile 方法。因此它没有找到该文件。FileExists 方法确实被调用并返回 true。
这是包含我要加载的视图的页面:
@model VTSMVC.Models.Controls.ControlData
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
@{
ViewBag.Title = @Model.PageTitle;
}
<h1>@ViewBag.Title</h1>
<div class="stockReportContainer">
@Html.Partial(@Model.ViewCompName, @Model)
</div>
这是加载视图的控制器方法:
public ActionResult Interactive_Stock_Report()
{
ControlData cd = GetControlData();
//this is the view returned on initial load
return View(cd);
}
最后是 VirtualPathProvider :
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Hosting;
namespace VTSMVC.Helpers.Utilities
{
public class BlobStorageVirtualPathProvider : VirtualPathProvider
{
public override bool FileExists(string virtualPath)
{
// Check if the file exists on blob storage
string cleanVirtualPath = virtualPath.Replace(@"~/Views/Shared/", "");
if (BlobExists(cleanVirtualPath))
{
return true;
}
else
{
return Previous.FileExists(virtualPath);
}
}
public override VirtualFile GetFile(string virtualPath)
{
//This gets called but only at the points where I don't need it
//ie it gets called where where I want Azure
string cleanVirtualPath = virtualPath.Replace(@"~/Views/Shared/", "");
if (BlobExists(cleanVirtualPath))
{
return new BlobStorageVirtualFile(virtualPath, this);
}
else
{
return Previous.GetFile(virtualPath);
}
}
public override System.Web.Caching.CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)
{
return null;
}
private bool BlobExists(string cleanVirtualPath)
{
switch(cleanVirtualPath)
{
//just doing a simple test for now
case "_MyStorageViewFile.cshtml":
return true;
default:
return false;
}
}
}
public class BlobStorageVirtualFile : VirtualFile
{
protected readonly BlobStorageVirtualPathProvider parent;
public BlobStorageVirtualFile(string virtualPath, BlobStorageVirtualPathProvider parentProvider) : base(virtualPath)
{
parent = parentProvider;
}
public override System.IO.Stream Open()
{
//Open Method blah blah blah -
//not getting to this point since GetFile doesnt get called!!
}
}
}