504 с большим набором результатов в RIA Domain Service - PullRequest
0 голосов
/ 29 марта 2011

Я создаю доменную службу RIA, которая должна выполнять запросы к таблице с большим количеством данных. Работая над этим, я понял, что размер таблицы может быть проблемой.

Например:

return this.ObjectContext.Logs;

завершается с ошибкой 504, тогда как:

return this.ObjectContext.Logs.Take(10);

работает.

Как видите, я работаю над таблицей логов, которая включает в себя поле "имя пользователя". Мне нужно получить все разные имена пользователей из таблицы. Поэтому я настроил этот метод:

public IEnumerable<string> GetUsers()
    {
        var users = (from l in this.ObjectContext.Logs
                    select l.Username).Distinct().Take(10);

        return users;
    }

Я пытаюсь выполнить все необходимые операции на стороне сервера, чтобы уменьшить передаваемую информацию (и относительную задержку) до минимума.

Однако даже с этим запросом я получаю ошибку 504. В Fiddler я вижу: «Ошибка ReadResponse (): сервер не возвратил ответ на этот запрос».

Изначально я думал, что это проблема с транспортом (возможно, размер передаваемых данных был слишком большим или около того), поэтому я установил точку останова для «обратных пользователей». Я запустил код, и отладчик остановился на строке «возврат пользователей». Я нажал на «представление результатов», но в тот момент он не смог отобразить какой-либо результат, просто показывая ошибку.

Я бы хотел сообщить об ошибке здесь, но внезапно Visual Studio больше не останавливается на точках останова DomainService и останавливается только на точках проекта Silverlight. Я на самом деле исследую это, так как кажется, что он больше не вызывает доменную службу (fiddler больше не показывает никаких вызовов к службе домена ria).

Есть ли кто-нибудь, кто может помочь мне в решении этих проблем? Я действительно изо всех сил пытаюсь заставить это работать.

Заранее спасибо, Ура, Джанлука

Ответы [ 2 ]

1 голос
/ 12 июня 2012

Вы можете выбрать размер ответа службы Ria: Отредактируйте ваш файл конфигурации: (maxItemsInObjectGraph)

<system.serviceModel>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
      multipleSiteBindingsEnabled="true" />
    <services>
      <service name="ModuleDossier.DSDossier" behaviorConfiguration="DSDossier_BehaviorConfig"></service>      
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="DSDossier_BehaviorConfig">
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
        <behavior name="DSDossier_BehaviorConfig1">
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
0 голосов
/ 20 мая 2011

Хорошо, так что через некоторое время я должен дать ответ на свой вопрос.

Нет ничего плохого в RIA или EF и т. Д. При длительных операциях будут достигнуты ограничения по времени и размеру, это нормально.и правильно.В моем случае речь идет о таблице, которая содержит 32 млн строк.

Мы используем PostgreSQL 9.0.Таблица уже была проиндексирована, но при увеличении количества возвращаемых строк индексы не используются.Чтобы преодолеть проблемы с производительностью, с которыми мы столкнулись, мы провели серьезный рефакторинг как базы данных, так и приложения.Таблицы были разбиты на разделы, таблицы поддержки со счетчиками были созданы и теперь используются вместо операций COUNT, с включенным автоматическим вакуумом, увеличено число индексов во всех наиболее значимых и используемых полях поиска и, что важно, запросы были рассмотрены вЧтобы уменьшить возвращаемый набор записей.

Новое приложение, работающее в среде разработки (в которой доступно всего несколько ресурсов), отвечает в течение нескольких секунд на любой запрос, даже если база данных растет на 2-4 млн. Строк в месяц.

Вот и все.Я надеюсь, что это может помочь кому-то еще.

Приветствия, Джанлука.

...