2009-10-05 69 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表达式生成枚举数可能会很昂贵的情况。仍然是在几百毫秒,我的印象是你的延迟比这大。可能值得检查。