1

我在這裏遇到了一些性能問題:下面的代碼是我自定義的VirtualPathProvider的一部分,我覆蓋了GetCacheKey和GetCacheDependency,因此它們可以正確緩存我的剃鬚刀視圖。每當編譯器通過VirtualPathProvider重新編譯我的剃鬚刀視圖時,我該如何放置日誌?

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的網站,它需要年齡獲取呈現的頁面。

視圖存儲在Azure Blob存儲上,我將日誌條目放在GetFile上,並發現它們被緩存,但它看起來像網站不斷重新編譯在每個頁面上(是的每一頁,因爲它是編譯如果我刷新Azure網站頁面即時顯示,但沒有其他網頁,我沒有訪問)

所以我的第一個猜測是 - Azure網站性能非常差,然後我升級到P3大型實例Web應用程序服務計劃,並仍然有同樣的問題。所以這讓我想到我在VirtualPathProvider中有什麼錯誤嗎?由於GetFile()方法並不總是被打開,並且刷新後立即顯示訪問頁面,所以我確信緩存也可以工作,所以它讓我想到在進程期間是否發生了其他任何編譯,導致每個頁面佔用這麼多第一次加載的時間?

任何人都可以幫忙請...

在此先感謝。

+0

你是否在你的web.config中設置了''?如果我沒有記錯的話,如果你的web.config打開了debug,即使在發佈模式下編譯,視圖緩存默認是禁用的。 –

+0

沒有調試屬性通過我們的web.release.config被刪除,所以我肯定緩存工作 - 我會在深入研究後不久寫一個答案 –

回答

0

嗨對於那些有興趣誰知道這個問題的結果:

以及我沒有找到一個完美的解決方案,但是我卻發現該網站部署到雲服務後,它解決的問題幾乎立即....

在代碼,部署或視圖中的任何東西沒有區別,但我想有專用資源比較Azure網站和vs雲服務(即使事實上我曾嘗試過大型實例Azure網站,但由於某些原因,它並未與標準中型雲服務實例競爭。)

我確信有數百萬用戶使用Azure,因此毫無疑問,我的代碼當然有一些關鍵的性能問題。我不得不首先使其通過使用雲服務功能,然後試圖找到一種方式部署(否則我們的客戶將驅使我們瘋了!)

到底發生了什麼之後,對其進行優化:

複雜性1 )我們的應用程序實際上是一個多租戶的ASP.NET MVC網站,它爲我們的客戶呈現網站(即網站建設者)。我們讓客戶在剃刀查看自己的代碼,以便自帶的編譯性能的影響(因此,我們的主題問題)犧牲

複雜性2)我們所有客戶的網站是完全不同的觀點存儲在Azure Blob存儲中! (我們有另一個單獨的後端系統來管理這些網站)因此,我們不能使用本地文件系統來查看視圖 - 即默認的ASP。NET MVC視圖引擎將無法正常工作,並且做一個基本的自定義視圖引擎將不工作,要麼導致我們實現我們自己的VirutalPathProvider和的CacheDependency

複雜性3)我們的網站都在使用我們自己內部的OAuth服務器管理,所以基本上所有在網站上搜索到的數據都是通過內部的API調用,這也延緩了視圖渲染時間。

過去幾周我們一直在週末和晚上工作,解決了複雜性問題2)現在由於性能不佳而變得非常沮喪。

從字面上看,我們在凌晨2點坐在一起考慮出了什麼問題,並提出了上述基本關鍵因素。我們將確實解決Complexity 3),但對於複雜性1)我們必須臨時選擇Cloud Service來解決問題(仍然很慢,但至少網站可以在可接受的時間內打開)

挫敗感也來了當我們使用我們自己的專用服務器時,VPS甚至是Azure VM都可以正常工作(平臺中呈現的網站可以在2秒鐘內以我們的本地調試模式打開,但不提及與Azure SQL和Blob存儲的遠程連接。)

所以神話仍然存在,最終的解決方案還沒有找到。但是我們決定暫時使用當前的速度和當前的Cloud Service,並且稍後在我們先安頓客戶時進行進一步調查......

任何人都有任何線索或意識到我們已經完成了根據我上面的着作錯誤,請讓我知道 - 非常感謝!

相關問題