Служба данных WCF взорвалась - очень тяжелая нагрузка - в любом случае, чтобы избежать беспорядка? - PullRequest
0 голосов
/ 10 ноября 2011

Я использую WCF Data Services (v2), и моя Entity Model со временем немного выросла, то есть более 100 сущностей.Существует немало навигации, которая возможна.Пользовательские интерфейсы клиента - это LOB-приложения с экранами ввода и поиска данных.Формы поиска возвращают наборы данных, а формы ввода данных обычно состоят из ОДНОЙ сущности, которая обладает большинством свойств, но с МНОГИМИ свойствами навигации из-за комбинированных списков, необходимых для отображения этих отдельных коллекций (например, форма ввода данных Сотрудника с ComboBox, отображающимиСписок состояний или список отделов. Я лениво загружаю данные комбинированного списка. FYI.

Проблема, с которой я сталкиваюсь, заключается в том, что если я хочу заполнить простой список (через ComboBox), то полезная нагрузка будет HUMONGOUS! Использование fiddler, напримерв сгенерированном XML есть куча беспорядка, который на самом деле мне НЕ НУЖЕН просто заполнять этот ComboBox.

Вот пример ОДНОЙ записи, возвращаемой с типом Employee.

   ----------------------------- 

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xml:base="http://localhost/HumanResourcesService.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
  <title type="text">Employees</title>
  <id>http://localhost/HumanResourcesService.svc/Employees</id>
  <updated>2011-11-09T23:41:01Z</updated>
  <link rel="self" title="Employees" href="Employees" />
  <entry>
    <id>http://localhost/HumanResourcesService.svc/Employees('54924')</id>
    <title type="text"></title>
    <updated>2011-11-09T23:41:01Z</updated>
    <author>
      <name />
    </author>
    <link rel="edit" title="Employee" href="Employees('54924')" />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/EmployeeTypes" type="application/atom+xml;type=feed" title="EmployeeTypes" href="Employees('54924')/EmployeeTypes" /> 
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Locations" type="application/atom+xml;type=feed" title="Locations" href="Employees('54924')/Locations" />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Buildings" type="application/atom+xml;type=feed" title="Buildings" href="Employees('54924')/Buildings" />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Managers" type="application/atom+xml;type=feed" title="Managers" href="Employees('54924')/Managers" />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Assignments" type="application/atom+xml;type=feed" title="Assignments" href="Employees('54924')/Assignments" />
    // ********************************************
    // MANY MORE LINKS - REMOVED FOR BREVITY
    // ********************************************        
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/xxx" type="application/atom+xml;type=entry" title="xxx" href="Employees('54924')/xxx" />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/yyy" type="application/atom+xml;type=entry" title="yyy" href="Employees('54924')/yyy" />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/zzz" type="application/atom+xml;type=entry" title="zzz" href="Employees('54924')/zzz" />
    <category term="xxx.HumanResources.Employee" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
    <content type="application/xml">
      <m:properties>
        <d:EmpNo m:type="Edm.String">54924</d:EmpNo>
        <d:FirstName m:type="Edm.String">John</d:FirstName>
        <d:LastName m:type="Edm.String">Hughes</d:LastName>
        <d:MiddleName m:type="Edm.String">Michael</d:MiddleName>
        <d:Salary m:type="Edm.Decimal">20000</d:Salary>
        <d:Notes m:type="Edm.String">Anything...</d:Notes>
        <d:PrimaryPhone m:type="Edm.String">984-875-4545</d:PrimaryPhone>
        <d:StartDate m:type="Edm.DateTime">1977-02-01T00:00:00</d:StartDate>
        <d:EndDate m:type="Edm.DateTime">1995-12-31T00:00:00</d:EndDate>
        // ********************************************
        // MANY MORE PROPERTIES - REMOVED FOR BREVITY
        // ********************************************
        <d:AnotherFieldX m:type="Edm.Double" m:null="true" />
      </m:properties>
    </content>
  </entry>
</feed>

-----------------------------

Как видите, мне не нужен весь этот мусор, такой как эти ССЫЛКИ, и это всего лишь ОДИН объект. Все эти комбинированные списки связаны со многими объектами (в диапазоне от 10 до 1000 записей). Как вы можете себе представить,вся эта лишняя болтовня может быстро взорвать мой сервис. Все, чего я хочу, этодля отображения коллекции Имен сотрудников в этом случае (много похожих случаев для ComboBox).

Кто-нибудь сталкивался с этим запутанным сценарием?Я ищу некоторые рекомендации.

Ответы [ 4 ]

2 голосов
/ 10 ноября 2011

Ссылки не сериализуются, если вы используете $ select:

1 голос
/ 11 ноября 2011

Вы пробовали JSON в отличие от XML? Форматирование JSON по сути скуднее. Вы также можете (как предложили другие) использовать параметр $ select = Query, чтобы ограничить количество возвращаемых полей.

0 голосов
/ 12 января 2012

Вам нужно, чтобы все наборы сущностей в вашей модели данных были представлены вашей службой OData?

Если вы предоставляете только те наборы сущностей, которые вам нужны ( вызовет SetEntitySetAccessRule один раз для каждого набора сущностей)), вы не получите ссылку rel, созданную для любых объектов, не предоставляемых службой данных.

С другой стороны, если вам нужны все эти связанные объекты в вашемединицей работы, может быть, ваша модель данных чрезмерно нормализована, и вы можете немного ее денормализовать.Если вы уже используете $select для уменьшения размера данных свойств объекта, это может привести к уменьшению общего объема XML, но я только догадываюсь об этом, и вам нужно будет его протестировать.

Конечно, (какЛеон предположил) JSON - самый эффективный формат проводов для OData, но клиентские библиотеки WCF Data Services пока не поддерживают JSON.

0 голосов
/ 10 ноября 2011

Вы можете использовать опцию запроса $ select, чтобы проецировать только те поля, которые вас интересуют. В вашем случае, если вы добавите $ select = FirstName, LastName, вы не увидите все остальные поля, которые вам не нужны.

Проверьте документацию для более подробной информации.Я не помню, сериализуются ли ссылки, если вы делаете проекцию, так что у вас все еще могут быть такие издержки.

...