4

(Azure Storage から) 部分ビューを読み取るために VirtualPathProvider を作成しましたが、VirtualPathProvider で (Azure Storage 内の) ビューを検索するページに到達しても、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