1

我在这里遇到了一点性能问题:下面的代码是我的自定义 VirtualPathProvider 的一部分,我已经覆盖了 GetCacheKey 和 GetCacheDependency,因此它们可以正确地缓存我的剃刀视图。

public override string GetCacheKey(string virtualPath)
{
    var key = string.Empty;
    var fileResult = VerifyFilePath(virtualPath);
    if (fileResult.RefinedAccessPath.IsNotNullOrEmpty())
        key = EncryptHelper.MD5Encrypt(fileResult.RefinedAccessPath);
    else
        key = EncryptHelper.MD5Encrypt(fileResult.VirtualPath);

    return key;
}

public override string GetFileHash(string virtualPath, System.Collections.IEnumerable virtualPathDependencies)
{
    var fileResult = VerifyFilePath(virtualPath);
    var hash = string.Empty;
    if (fileResult.RefinedAccessPath.IsNotNullOrEmpty())
        hash = EncryptHelper.MD5Encrypt(fileResult.RefinedAccessPath);
    else
        hash = Previous.GetFileHash(fileResult.VirtualPath, virtualPathDependencies);

    return hash;

}
public override System.Web.Caching.CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)
{
    var fileResult = VerifyFilePath(virtualPath);
    switch (fileResult.Result)
    {
        case ExistenceResult.FoundInCloudAfterRebuildPath:
        case ExistenceResult.FoundInCloudDirectly:
            return new OSiteCacheDependency(fileResult.LastModified, ositeVirtualPathHelper.SiteID.ToString(), utcStart);
        default:
            if (fileResult.RefinedAccessPath.IsNotNullOrEmpty())
                return new System.Web.Caching.CacheDependency(fileResult.RefinedAccessPath);
            else
                return null;
    }
}

但是目前我有点担心我的代码是否正确 - 因为当我在本地 PC 上测试它时,它可以完美运行,但是如果我将它上传到 Azure 网站,则需要 AGES 才能渲染页面。

视图存储在 Azure Blob 存储中,我将日志条目放在 GetFile 上并发现它们被缓存,但是看起来网站在每个页面上都在不断重新编译(是的,每个页面,因为当我刷新时它被编译Azure 网站页面会立即显示,但不会显示我未访问过的其他页面)

所以我的第一个猜测是 - Azure 网站性能很差,但后来我将它升级到 P3 大型实例 Web 应用服务计划,仍然遇到同样的问题。所以这让我想我在 VirtualPathProvider 中是否有任何错误?由于 GetFile() 方法并不总是被命中并且访问的页面在刷新后立即显示,我确信缓存也在工作,所以它让我思考在这个过程中是否发生了任何其他编译导致每个页面占用这么多第一次加载的时间?

谁能帮忙请...

提前致谢。

4

1 回答 1

0

嗨,对于那些有兴趣了解此问题结果的人:

好吧,我没有找到完美的解决方案,但是我确实发现在将网站部署到云服务后,它几乎立即解决了这个问题......

代码、部署或视图中的任何内容都没有区别,但我想在比较 Azure 网站与云服务的专用资源上存在问题(即使我尝试过大型实例 Azure 网站,它也没有与标准竞争出于某种原因,中等规模的云服务实例。)

我确信有数百万人在使用 Azure,所以毫无疑问我的代码肯定存在一些关键的性能问题。我必须首先使用云服务使其正常运行,然后在部署后尝试找到优化它的方法(否则我们的客户会让我们发疯!)

所以发生了什么事:

复杂性 1)我们的应用程序实际上是一个多租户 ASP.NET MVC 网站,它为我们的客户(即网站构建器)呈现网站。我们允许客户在 Razor Views 中拥有自己的代码,这样会牺牲编译中的性能影响(因此我们在主题中遇到了问题)

复杂性 2)我们所有客户的网站都完全不同,视图存储在 Azure Blob 存储中!(我们有另一个单独的后端系统供他们管理这些网站)因此,我们不能为视图使用本地文件系统 - 即默认的 ASP.NET MVC 视图引擎将不起作用,并且通过做一个基本的自定义视图引擎将也不起作用,这导致我们实现了我们自己的 VirutalPathProvider 和 CacheDependency

复杂性 3)我们的网站是使用我们自己的内部 OAuth 服务器管理的,所以基本上所有在网站中检索的数据都是通过内部 API 调用,这也延迟了视图呈现时间。

在过去的几周里,我们一直在周末和晚上工作,以解决复杂性 2),现在对目前的糟糕表现感到非常沮丧。

从字面上看,我们在午夜 2 点坐在一起思考出了什么问题,并做出了上述基本关键因素。我们肯定会解决复杂性 3),但是对于复杂性 1)我们必须暂时选择云服务来解决问题(仍然很慢,但至少可以在可接受的时间内打开网站)

当我们使用我们自己的专用服务器、VPS 甚至 Azure VM 时,我们也感到沮丧,一切都正常运行(平台中呈现的网站可以在 2 秒内以我们的本地调试模式打开,更不用说远程连接到 Azure SQL 和 Blob 存储了。 )

所以神话仍然存在,最终的解决方案还没有找到。但是已经决定,我们现在将使用当前的速度和当前的云服务,等我们先安顿客户时再做进一步的调查……

根据我上面的文章,任何人都有任何线索或意识到我们做错了什么,请告诉我 - 非常感谢!

于 2015-12-13T11:33:51.193 回答