2009-10-05 7 views
0

LISEZ D'ABORD avant de répondre!Optimisation d'une requête RESTful dans le client

J'ai un service RESTful qui entoure Entity Framework. Fondamentalement, tout ce que j'ai fait était de créer une base de données, ajouter des relations entre les tables, créer un modèle Entity autour de cette base de données et enfin exposer l'ensemble comme un service RESTful * .svc. Ceci est fait, ne peut pas être changé non plus.

Maintenant, j'ai besoin d'interroger des données à partir d'une application cliente. Tout ce que je peux accéder est le service lui-même. Je ne peux pas ajouter de code côté serveur, même si je le voulais. Le serveur est maintenant verrouillé.

J'ai besoin de récupérer des données d'une table appelée "ProductVoorwaarden" (conditions du produit) qui est liée à trois autres tables. (Rubriek, Categorie et Datatype.) Ces données doivent être retournées en XML, avec un nœud racine appelé "PRODUCTVOORWAARDEN" et chaque enregistrement dans son propre XElement appelé "REC". Au sein de ce REC, il y a un attribut pour chaque champ de la table plus des références aux tables liées. Voici le code que j'ai en ce moment:

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; 
} 

Ce code fonctionne bien, mais il est lent. Il lit tous les enregistrements ProductVoorwaarden, mais il doit à nouveau effectuer des allers-retours au serveur pour chaque enregistrement afin de récupérer Rubriek.Code, Categorie.Naam et Datatype.Naam. (Dans la base de données, ces relations sont définies par un champ Identity auto-incrémental, mais le code XML utilise le code ou Naam comme référence.)

Comme vous pouvez l'imaginer, chaque retour au service RESTful prend plus de temps, que j'essaye d'éviter. Alors, y a-t-il un moyen d'accélérer un peu le processus du côté client?


Le serveur est encore en développement et la prochaine version prendra quelques mois de plus. Par conséquent, je dois gérer les options que le serveur fournit actuellement. S'il n'y a aucun moyen d'accélérer cela sans modifier le serveur, alors bien. Au moins, j'ai essayé. Il y a 35 tables de plus qui doivent être traitées avec une date limite dans quelques jours, donc si cela fonctionne, alors cela fonctionne.

Répondre

1

Vous pouvez rendre chacun de vos appels COBA.LoadProperty asynchrones et les exécuter en parallèle plutôt que séquentiellement. Cela rendra votre code client plus complexe car vous devrez gérer le retour de chaque appel asynchrone et déterminer quand ils ont tous été terminés et si vous êtes prêt à créer votre code XML. En supposant que chacun de vos 4 appels REST prend le même temps qui réduirait le retard de moitié.

Vous avez probablement déjà vérifié, mais j'ai rencontré des cas où la génération de l'énumérateur à partir de l'expression lambda peut être coûteuse. Pourtant, c'était dans les centaines de millisecondes et j'ai l'impression que votre retard est plus grand que cela. Peut être utile de vérifier.

Questions connexes