4

我创建了一个 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!!   
    }
}
}
4

0 回答 0