Оптимизация RESTful-запроса в клиенте - PullRequest
0 голосов
/ 05 октября 2009

ПРОЧИТАЙТЕ ПЕРВОЕ, прежде чем ответить!

У меня есть служба RESTful, которая работает вокруг Entity Framework. По сути, все, что я делал, это создавал базу данных, добавлял связи между таблицами, создавал модель Entity вокруг этой базы данных и, наконец, представлял все это как службу RESTful * .svc. Это сделано, также не может быть изменено.

Теперь мне нужно запросить данные из него через клиентское приложение. Все, что я могу получить, это сам сервис. Я не могу добавить серверный код, даже если бы захотел. Сервер теперь заблокирован.

Мне нужно получить данные из таблицы с именем «ProductVoorwaarden» (условия продукта), которая связана с тремя другими таблицами. (Rubriek, Category и 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, Categoryorie.Naam и Datatype.Naam. (В базе данных эти отношения устанавливаются с помощью поля автоинкрементной идентификации, но в качестве кода XML используется код или Naam.)

Как вы можете себе представить, каждая поездка обратно на службу RESTful просто съедает больше времени, которого я стараюсь избегать. Так есть ли способ ускорить это все на стороне клиента? <ч /> Сервер все еще находится в стадии разработки, и следующий выпуск займет еще несколько месяцев. В результате мне приходится иметь дело с параметрами, которые сервер предоставляет прямо сейчас. Если нет способа ускорить это без изменения сервера, тогда хорошо. По крайней мере, я пытался. Есть еще 35 таблиц, которые должны быть обработаны с крайним сроком в течение нескольких дней, так что если он работает, то он работает.

1 Ответ

1 голос
/ 05 октября 2009

Вы можете сделать каждый из ваших вызовов COBA.LoadProperty асинхронным и запускать их параллельно, а не последовательно. Это сделает ваш клиентский код более сложным, так как вам придется обрабатывать возврат каждого асинхронного вызова и определять, когда они все завершены, и вы готовы построить свой XML. Предположим, что каждый из ваших 4 вызовов REST занимает одинаковое количество времени, что уменьшит задержку вдвое.

Возможно, вы уже дважды проверили, но я сталкивался со случаями, когда генерация перечислителя из лямбда-выражения может быть дорогой. Тем не менее это было за сотни миллисекунд, и у меня сложилось впечатление, что ваша задержка больше, чем это. Может стоит проверить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...