2014-02-21 5 views
0

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

  1. Каждый клиент связан с учетной записью. Таким образом, клиент должен будет отправить серверу идентификатор учетной записи и запрос.

  2. После этого сервер получит идентификатор и запрос учетной записи. Затем сервер выполнит объединение всех таблиц и строк, относящихся к этой учетной записи.

  3. После того, как сервер имеет все записи, относящиеся к этой учетной записи, в качестве утверждения объединения. Затем он выполнит запрос, отправленный клиентом, и выполнит этот запрос против объединения, а не всю базу данных.

Так что мой вопрос, как я могу отправить запрос LINQ к серверу? Например я хотел клиент, чтобы отправить:

//   Id of Account     QUERY 
object[]{ "AfKX-3451-X4hT-...", myContext.Customers.Where(x=>x.Age>18) } 

Второй параметр имеет тип IQueryable поэтому я не могу сериализовать :(

Если злоумышленник декомпилирует клиентское приложение и изменяет запросы, то он будет влиять только на его учетную запись, а не на всю базу данных.

+2

У вас будет копия вашей модели EF на месте? –

+1

Это звучит как плохая идея. Не только потому, что * любой * мог декомпилировать приложение, но главным образом потому, что он потянет всю бизнес-логику в клиента. Когда клиент может получать или сохранять только гранулированные данные, вряд ли может быть какая-либо бизнес-логика сервера/службы. Но, в любом случае, похоже, что OData будет намного лучшим вариантом для достижения этой цели (в зависимости от типа приложения, о котором вы говорите). Кроме того, если речь идет о многократном аренде, есть лучшие способы борьбы с этим в EF (например, схема для каждого арендатора). –

ответ

1

Вы можете сериализовать второй параметр через библиотеки сериализатора дерева выражений, иначе вы можете найти сериализатор в исходном коде фреймворка сущности. call web serive с идентификатором пользователя и сериализованным запросом и объявлением d некоторые критерии для запроса, такие как query = query.Where (f => f.UserId == userId) и выполнить его.

Expression Tree Serializer

Вы должны вернуть известный тип для всех результата поиска, как у DataTable, DataRow ... вы можете реализовать свой собственный.

Кроме того, для этого можно использовать сторонние компоненты, например, фильтр фильтра telerik.

2

Я рекомендую разоблачить конечную точку OData и использовать Linq для запроса.
Для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/ee622463.aspx

+0

Я думаю, что реализация odata odata пока не готова, но ее мощная. твой выбор –

Смежные вопросы