在Web场方案中使用.NET MVC 4.0 VirtualPathProviders

时间:2013-06-18 15:51:39

标签: caching distributed mv virtualpathprovider cache-dependency

我们的应用程序在很大程度上依赖于扩展.NET System.Web.Hosting.VirtualPathProvider体系结构的虚拟文件系统。 我们使用链接搜索... (A)contentresourceprovider(扩展virtualpathprovider) (B)assemblyresourceprovider(同上) (C)物理文件系统

vpp是在app初始化时注册的,如此......

HostingEnvironment.RegisterVirtualPathProvider(new AssemblyResourceProvider());
HostingEnvironment.RegisterVirtualPathProvider(new ContentResourceProvider());

此问题与ContentResourceProvider相关(见下文)

public class ContentResourceProvider : System.Web.Hosting.VirtualPathProvider
{
    #region Methods 

    public override bool FileExists(string virtualPath)
    {
        var result = ContentResourceProvider.IsContentResourcePath(virtualPath) ?     ((ContentResourceVirtualFile)this.GetFile(virtualPath)).Exists : Previous.FileExists(virtualPath);
        return result;
    }

    public override CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)
    {
        var result = ContentResourceProvider.IsContentResourcePath(virtualPath) ? new ContentResourceCacheDependency(virtualPath) : Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
        return result;
    }

    public override System.Web.Hosting.VirtualFile GetFile(string virtualPath)
    {
        var result = ContentResourceProvider.IsContentResourcePath(virtualPath) ? new ContentResourceVirtualFile(virtualPath) : Previous.GetFile(virtualPath);
        return result;
    }

    public override string GetFileHash(string virtualPath, System.Collections.IEnumerable virtualPathDependencies)
    {
        var result = base.GetFileHash(virtualPath, virtualPathDependencies);
        return result;
    }

    public static bool IsContentResourcePath(string virtualPath)
    {
        var pattern = @"~?/\(ContentManagementResource\)";
        var result = Regex.IsMatch(virtualPath, pattern, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
        return result;
    }

    #endregion Methods 
}

基本上这一切都很有效,每当我们通过我们的cms工具更新内容时,虚拟文件​​从缓存中删除并重新打开/编译成剃刀视图。 到目前为止一切都好.... 然而,我们最近将其部署到服务器场,似乎整个先天的System.Web.Hosting虚拟文件提供程序东西不会扩展(显然)它相对于将虚拟文件存储在内存中的特定服务器等。 这意味着如果用户A通过cms工具更改剃刀视图并且操作在服务器A上执行,则用户B在服务器B上进行另一次更改将提供不良结果,尽管内容来自同一数据库。这是因为缓存剃刀视图的虚拟文件系统对于运行它们的Web服务器是唯一的,同样缓存依赖性仅在相关服务器上触发。

我尝试过使用像AppFabric,Memcached,NCache这样的分布式缓存包。这些是不够的,因为它们依赖于您手动编写将序列化对象插入分布式缓存的代码。首先,.NET vpp内存的内容是有效管理的,并且强制执行严格的设计模式,而且CacheDependency类也不可序列化。

经过多个小时的研究后,我无法在线找到解决方案。

当然,整个.NET MVC 4.0 VirtualPathProvider / CacheDependency系统架构必须能够跨多个服务器进行扩展吗?

我想从我对此问题的理解中我想问有没有办法在多个服务器上扩展System.Web.Hosting缓存内存,以便附加到这些文件的虚拟内容和缓存依赖项按预期工作? / p>

非常感谢任何帮助。

0 个答案:

没有答案