2009-10-05 99 views
0

在應答之前先閱讀!在客戶端優化RESTful查詢

我有一個RESTful服務,它圍繞實體框架。基本上,我所做的只是創建一個數據庫,在表之間添加關係,圍繞此數據庫創建實體模型,並最終將整個事件公開爲RESTful * .svc服務。這樣做,也不能改變。

現在我需要通過客戶端應用程序從它查詢數據。我可以訪問的只是服務本身。即使我想,我也不能添加任何服務器端代碼。服務器現在被鎖定。

我需要從名爲「ProductVoorwaarden」(產品條件)的表格中檢索數據,該表格鏈接到其他三個表格。 (Rubriek,Categorie和Datatype。)這些數據需要以XML格式返回,其中一個名爲「PRODUCTVOORWAARDEN」的根節點以及它自己的XElement中的每個記錄都稱爲「REC」。在此REC中,表中的每個字段都有一個屬性,並加上對相關表的引用。這裏是我現在的代碼:

XElement PRODUCTVOORWAARDEN() 
{ 
    XElement Result = new XElement("PRODUCTVOORWAARDEN"); 
    var Brondata = COBA.Productvoorwaarden.OrderBy(O => O.Code); 
    foreach (var item in Brondata) 
    { 
     COBA.LoadProperty(item, "Rubriek"); 
     COBA.LoadProperty(item, "Categorie"); 
     COBA.LoadProperty(item, "Datatype"); 
     XElement REC = new XElement("REC", 
      Attribute("Rubriek", item.Rubriek.Code), 
      Attribute("Categorie", item.Categorie.Naam), 
      Attribute("Code", item.Code), 
      Attribute("Datatype", item.Datatype.Naam), 
      Attribute("Eenheid", item.Eenheid), 
      Attribute("Naam", item.Naam), 
      Attribute("Omschrijving", item.Omschrijving), 
      Attribute("UitgebreideTekstVeld", item.UitgebreideTekstVeld), 
      Attribute("Veld", item.Veld) 
     ); 
     Result.Add(REC); 
    } 
    return Result; 
} 

此代碼工作正常,但速度很慢。它讀取所有ProductVoorwaarden記錄,但它必須再次對服務器進行往返服務,才能檢索Rubriek.Code,Categorie.Naam和Datatype.Naam。 (在數據庫中,這些關係由自動增量標識字段設置,但XML代碼使用代碼或Naam作爲參考)。

正如您所想,每次返回到REST服務的行程都會消耗更多時間,我試圖避免。那麼有什麼方法可以在客戶端更快地加速這一切嗎?


服務器仍在開發中,下一個版本將需要幾個月的時間。因此,我必須處理服務器現在提供的選項。 如果沒有辦法在不修改服務器的情況下加快速度,那很好。至少我已經嘗試過了。還有35個表格需要在幾天內完成處理,所以如果它能正常工作,那麼它就可以工作。

回答

1

您可以使每個COBA.LoadProperty調用都是異步的,並且它們並行而不是按順序運行。它會使你的客戶端代碼更加複雜,因爲你必須處理每個異步調用的返回並確定它們什麼時候全部完成,並且準備好構建XML。假設您的4個REST呼叫中的每個呼叫都花費了相同的時間量,以使延遲減少一半。

您可能已經加倍檢查過,但我遇到過從lambda表達式生成枚舉數可能會很昂貴的情況。仍然是在幾百毫秒,我的印象是你的延遲比這大。可能值得檢查。