Создание приложений Silverlight (службы WCF Data Services)

Важно!

Клиентская библиотека Службы WCF Data Services 5.0 для Silverlight не поддерживается приложениями Windows Phone.Вместо нее следует использовать клиентскую библиотеку OData для Windows Phone, входящую в состав пакета Windows Phone 7.1 SDK.Дополнительные сведения см. по адресу Обзор протокола OData для Windows Phone.В настоящее время клиентская библиотека для Windows Phone с поддержкой OData v3 не существует.

Клиентская библиотека Службы WCF Data Services для Silverlight создает HTTP-запросы к службе данных, которая поддерживает версию 3 протокола OData и преобразует данные в канале ответа OData в объекты на клиенте. Клиентская библиотека содержит два основных класса: DataServiceContext и DataServiceQuery<TElement>. Класс DataServiceContext инкапсулирует операции, которые выполняются с конкретной службой данных. Службы на основе OData не поддерживают состояние. Но DataServiceContext поддерживает состояние сущностей на стороне клиента от одного взаимодействия со службой данных к другому. Это обеспечивает поддержку клиентом таких функций, как отслеживание изменений и управление идентификаторами. Класс DataServiceQuery<TElement> представляет запрос к определенному набору сущностей. Дополнительные сведения см. по адресу Использование службы данных в приложении .NET Framework (службы WCF Data Services). Реальный пример приложения, использующего канал из образца службы данных Northwind, см. по адресу Краткое руководство по службам данных WCF для Silverlight

Примечание

При использовании клиентской библиотеки Службы WCF Data Services для Silverlight все запросы к службе выполняются асинхронно.Дополнительные сведения см. в разделе Асинхронные операции (службы WCF Data Services).

В данном разделе содержатся следующие подразделы:

Формирование классов службы данных клиента

Диалоговое окно Добавить ссылку на службу в Visual Studio можно использовать для добавления ссылки на любую службу, предоставляющую доступ к каналу OData. Дополнительные сведения см. в разделе Формирование классов службы данных клиента (WCF Data Services). Клиентские классы службы данных можно также сформировать при помощи программы DataSvcUtil.exe из командной строки. Дополнительные сведения см. в разделе Как формировать клиентские классы службы данных вручную (службы WCF Data Services).

Примечание

При установке Службы WCF Data Services 5.0 средство добавления ссылки на службу автоматически добавляет ссылку в версию клиентской библиотеки Microsoft.Data.Services.Client.SL.dll вместо добавления ссылки в версию System.Data.Services.Client.dll в составе Silverlight.Если по какой-либо причине необходимо использовать предыдущую версию клиента Silverlight, нужно вручную добавить ссылку на версию Silverlight клиентской библиотеки.Дополнительные сведения см. в разделе Как формировать клиентские классы службы данных вручную (службы WCF Data Services).

Доступ к ресурсам и их изменение

В приложениях на основе Silverlight все операции со службой данных являются асинхронными. Асинхронные операции можно выполнять с применением пар методов по отношению к классам DataServiceContext и DataServiceQuery<TElement>, которые начинаются с Begin и End соответственно. Методы Begin регистрируют делегат, который вызывается службой по завершении операции. Методы End должны вызываться в делегате, зарегистрированном для обработки обратного вызова по завершении операций. При вызове метода End для завершения асинхронной операции это необходимо сделать с использованием того же экземпляра DataServiceQuery<TElement> или DataServiceContext, который использовался для запуска операции. Каждый метод Begin принимает параметр state, который может передавать объект состояния в обратный вызов. Этот объект состояния извлекается как IAsyncResult, который предоставляется в обратном вызове, и используется при вызове соответствующего метода End для завершения асинхронной операции. Например, если передается экземпляр DataServiceQuery<TElement> в качестве параметра state при вызове метода BeginExecute применительно к экземпляру, тот же экземпляр DataServiceQuery<TElement> возвращается как IAsyncResult. Этот экземпляр DataServiceQuery<TElement> затем используется при вызове метода EndExecute для завершения операции запроса. Дополнительные сведения см. в разделе Асинхронные операции (службы WCF Data Services).

Так как клиентская библиотека Службы WCF Data Services для Silverlight обращается к службе данных асинхронно с использованием сетевых протоколов, необходимо использовать метод BeginInvoke класса Dispatcher для правильного маршалинга операции ответа обратно в основной поток (поток пользовательского интерфейса) приложения на основе Silverlight. Дополнительные сведения см. в разделе Synchronizing Data for Multithreading.

Запрос ресурсов

Клиентская библиотека Службы WCF Data Services для Silverlight позволяет выполнять запросы к службе данных OData с помощью знакомых шаблонов программирования .NET Framework, включая использование Синтаксис LINQ. При вызове метода BeginExecute применительно к DataServiceQuery<TElement> или DataServiceContext клиентская библиотека преобразует запрос или универсальный код ресурса URI в сообщение запроса HTTP GET. Клиентская библиотека получает соответствующее ответное сообщение и преобразует его в экземпляры классов клиентской службы данных. Эти классы отслеживаются с помощью DataServiceContext, которому принадлежит объект DataServiceQuery<TElement>. Дополнительные сведения см. в разделе Как выполнить асинхронные запросы службы данных (службы WCF Data Services).

В некоторых сценариях полезно знать общее количество сущностей в наборе сущностей, а не только количество в канале, возвращаемое запросом. Вызовите метод IncludeTotalCount по отношению к объекту DataServiceQuery<TElement> для запроса, чтобы этот общий итог подсчета сущностей в наборе возвращался с результатом запроса. В этом случае свойство TotalCount возвращаемого объекта QueryOperationResponse<T> возвращает общее количество сущностей в наборе. Метод AddQueryOption можно также использовать для добавления любых других параметров запроса, поддерживаемого OData в запросе. Дополнительные сведения см. в разделе Запросы к службе данных (службы WCF Data Services).

Запросы LINQ

Поскольку класс DataServiceQuery<TElement> реализует интерфейс IQueryable<T>, определяемый языком LINQ, клиентская библиотека Службы WCF Data Services для Silverlight может преобразовывать запросы LINQ к данным набора сущностей в URI, который представляет выражение запроса, вычисляемое для ресурса службы данных. Например, следующий запрос LINQ возвращает канал, представляющий собой коллекцию сущностей Order, отфильтрованных по значению свойства CustomerID, которое предоставляется пользователем в текстовом поле customerId.

' Define a query that returns orders for a give customer.
Dim query = From orderByCustomer In context.Orders _
                Where orderByCustomer.Customer.CustomerID = _
                Me.customerId.Text _
                Select orderByCustomer
// Define a query that returns orders for a give customer.
var query = from orderByCustomer in context.Orders
            where orderByCustomer.Customer.CustomerID == this.customerId.Text
            select orderByCustomer;

Загрузка отложенного содержимого

По умолчанию Службы WCF Data Services ограничивает объем данных, возвращаемых запросом. Однако существует возможность явной загрузки при необходимости из службы данных дополнительных данных, включая связанные сущности, разбитые на страницы данные ответа и потоки двоичных данных. При выполнении запроса возвращаются только сущности в адресованном наборе сущностей. Например, когда запрос к службе данных Northwind возвращает сущности Customers, по умолчанию возврат связанных сущностей Orders не происходит, несмотря на наличие связи между сущностями Customers и Orders. Связанные сущности можно загрузить с помощью исходного запроса (безотложная загрузка) или на основе сущностей (явная загрузка). Дополнительные сведения см. в разделе Загрузка отложенного содержимого (службы WCF Data Services). При использовании клиента Silverlight и DataServiceCollection<T> можно загружать коллекции связанных сущностей из свойства навигации с помощью вызова LoadAsync.

Совет

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

Если в службе данных включено разбиение на страницы, необходимо явно загружать последующие страницы данных из службы данных, если количество возвращаемых сущностей превышает предел для разбиения на страницы. Поскольку невозможно заранее определить, когда происходит разбиение на страницы, рекомендуется обеспечить возможность для клиентского приложения Silverlight корректно обрабатывать канал OData с разбиением на страницы. Примеры обработки ответа с разбиением на страницы см. в Привязка данных службы данных к элементам управления (клиент Silverlight) и Запросы к службе данных (службы WCF Data Services).

Проекция запроса

Проекция предоставляет механизм для уменьшения объема данных в канале OData, который возвращается запросом при указании, что в ответе возвращаются только определенные свойства сущности. Дополнительные сведения см. в разделе Odata. Выбор системного параметра запроса ($select). Добавить предложение проекции к запросу LINQ можно с помощью предложения select (Select в Visual Basic). Возвращаемые данные сущности могут быть проецированы в типы сущностей или в типы, отличные от сущностей, на клиенте. Изменения, внесенные в типы, отличные от сущностей, невозможно сохранить в службе данных. Например, следующий запрос LINQ проецирует данные Customer в новый тип сущности CustomerAddress на стороне клиента.

Dim query = From c In context.Customers _
                    Where c.Country = "Germany" _
                    Select New CustomerAddress With
                        {.CustomerID = c.CustomerID, _
                         .Address = c.Address, _
                         .City = c.City, _
                         .PostalCode = c.PostalCode, _
                         .Country = c.Country _
                        }
var query = from c in context.Customers
            where c.Country == "Germany"
            select new CustomerAddress
            {
                CustomerID = c.CustomerID,
                Address = c.Address,
                City = c.City,
                PostalCode = c.PostalCode,
                Country = c.Country
            };

Важно!

При сохранении обновлений, выполненных в проецируемых типах, в службе данных может произойти потеря данных.Дополнительные сведения см. в разделе Вопросы проекции в документации по клиенту Службы WCF Data Services.

Дополнительные сведения см. в разделе Как проецировать результаты запроса службы данных (клиент Silverlight).

Изменение ресурсов и сохранение изменений

Клиент отслеживает изменения сущностей, указанных вручную с помощью выполнения следующих методов в DataServiceContext:

Эти методы позволяют клиенту отслеживать добавленные и удаленные сущности, а также изменения, вносимые в значения свойств или в связи между экземплярами сущностей. При использовании диалогового окна Добавить ссылку на службу для формирования клиентских классов службы данных создается также метод AddTo для каждой сущности в созданном классе DataServiceContext. Используйте эти методы для добавления нового экземпляра сущности к набору сущностей и создания сообщения о добавлении к контексту. Эти отслеживаемые изменения асинхронно передаются обратно в службу данных при вызове методов BeginSaveChanges и EndSaveChanges.

При добавлении новой сущности с помощью метода AddObject или соответствующего метода AddTo связи между новой сущностью и связанными сущностями автоматически не определяются. Пользователь может создать и изменить связи между экземплярами сущностей и отразить эти изменения в службе данных с помощью клиентской библиотеки. Отношения между сущностями определяются как сопоставления модели, а объект DataServiceContext отслеживает каждую связь в виде объекта ссылки в контексте. В Службы WCF Data Services предоставляются следующие методы класса DataServiceContext для создания, изменения и удаления ссылок.

Дополнительные сведения см. в разделе Обновление службы данных (службы WCF Data Services)

Работа с двоичными данными

OData определяет механизм доступа к двоичным данных отдельно от сущности, к которой они принадлежат. Таким образом, служба OData может обеспечивать доступ к двоичным данным как к медиаресурсу, принадлежащему к ссылке мультимедиа. Клиент Службы WCF Data Services для Silverlight может получить медиаресурс из службы OData в качестве двоичного потока. Для доступа к двоичному потоку вызовите метод BeginGetReadStream для экземпляра DataServiceContext, который отслеживает сущность, представляющую собой ссылку на медиаданные. Этот асинхронный метод возвращает объект DataServiceStreamResponse, когда вызывается метод EndGetReadStream в экземпляре DataServiceContext, возвращаемом обратным вызовом. Таким же образом медиаресурс передается в службу OData при вызове метода SetSaveStream и после вызова методов BeginSaveChanges и EndSaveChanges. Дополнительные сведения см. в разделе Как получить доступ к двоичным данным в виде потока (клиент Silverlight).

Привязка данных

Клиент Службы WCF Data Services для Silverlight поддерживает привязку данных к элементам управления с помощью класса DataServiceCollection<T>. Этот класс, наследующий от ObservableCollection<T>, представляет коллекцию динамических данных, обеспечивающих выдачу уведомлений при добавлении или удалении элементов из коллекции. Эти уведомления позволяют DataServiceContext автоматически отслеживать изменения без необходимости явного вызова методов отслеживания изменений. DataServiceCollection<T> определяется на основе DataServiceQuery<TElement>. Этот запрос при выполнении предоставляет объекты для коллекции.

Метод LoadAsync используется для асинхронного выполнения запроса и загрузки результатов в коллекцию. Этот метод гарантирует, что маршалинг результатов в поток осуществляется правильно, чтобы не требовалось использовать Dispatcher. При использовании экземпляра DataServiceCollection<T> для привязки данных клиент гарантирует, что объекты, отслеживаемые DataServiceContext, синхронизируются с данными в привязанном элементе пользовательского интерфейса. Не требуется вручную сообщать об изменении сущностей в коллекцию привязок в DataServiceContext. Дополнительные сведения см. в разделе Привязка данных службы данных к элементам управления (клиент Silverlight).

Междоменное выполнение

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

Примечание

Прежде чем предоставить для клиентов Silverlight доступ к веб-службам в разных доменах, необходимо внимательно рассмотреть вопросы безопасности.Дополнительные сведения см. в разделе HTTP Communication and Security with Silverlight.

Для большинства запросов к службе данных клиент Службы WCF Data Services для Silverlight использует XMLHTTP-реализацию. Но если клиент Службы WCF Data Services определяет междоменный запрос, клиент Silverlight автоматически переключается на HTTP-реализацию.

Примечание

Клиент автоматически переключается на HTTP-реализацию, только если для свойства HttpStack задано значение Auto.

Пример настройки службы данных для использования междоменных запросов в приложениях на основе Silverlight см. в сообщении Использование клиента Silverlight служб данных ADO.NET в сценариях работы в X-домене и вне браузера. Поддержка междоменного выполнения является новшеством в Silverlight 4.

Выполнение вне браузера

Приложения на основе Silverlight можно настроить так, чтобы пользователи могли их устанавливать со своих веб-страниц и выполнять их вне браузера. Клиент Службы WCF Data Services для Silverlight поддерживает выполнение вне браузера. Если клиент Службы WCF Data Services определяет, что приложение выполняется вне браузера, то автоматически переключается на использование HTTP-реализации клиента Silverlight. Это такая же ситуация, как и с междоменным выполнением, но при этом не требуется междоменный файл политики. Дополнительные сведения см. в разделе Out-of-Browser Support.

Аутентификация клиента

По умолчанию клиент Службы WCF Data Services для Silverlight создает запросы к службе данных с использованием тех же учетных данных клиента, что и веб-браузер. Аутентификация при этом выполняется с помощью веб-браузера. Если доступ к службе данных требует междоменного запроса или если приложение Silverlight выполняется вне веб-браузера, можно указать учетные данные, предоставленные при создании запроса. В этих сценариях клиент автоматически использует для создания запросов HTTP-реализацию клиента Silverlight. Для аутентификации используются учетные данные по умолчанию. Если для свойства UseDefaultCredentials задано значение false, клиент использует значение ICredentials, назначенное свойству Credentials при аутентификации для службы данных.

Предупреждение

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

Также можно предоставить учетные данные, требуя от приложения использовать HTTP-реализацию клиента Silverlight. Для этого необходимо задать для свойства HttpStack значение ClientHttp. Следующий код гарантирует, что для доступа к службе данных используются учетные данные, полученные от пользователя во время выполнения.

' Select the client HTTP stack and set the credentials.
context.HttpStack = HttpStack.ClientHttp
context.UseDefaultCredentials = False
context.Credentials = _
    New NetworkCredential(userName, password, domain)
// Select the client HTTP stack and set the credentials.
context.HttpStack = HttpStack.ClientHttp;
context.UseDefaultCredentials = false;
context.Credentials = 
    new NetworkCredential(userName, password, domain);

Если HTTP-реализация клиента Silverlight не используется, задание для свойства UseDefaultCredentials значения false вызывает исключение при выполнении. Если для свойства UseDefaultCredentials задано значение true, используются учетные данные по умолчанию, даже если задано свойство Credentials.

Предупреждение

Данные, отправляемые с помощью базовой и дайджест-аутентификации, не шифруются, поэтому злоумышленник может их видеть.Кроме того, базовые учетные данные аутентификации (имя пользователя и пароль) передаются в открытом виде и могут быть перехвачены.

Дополнительные сведения см. в разделе Как указать учетные данные клиента для запроса службы данных (клиент Silverlight). Пример доступа к службе данных на основе аутентификации ASP.NET с помощью форм из приложения Silverlight см. в статье Использование клиента Silverlight служб данных ADO.NET в сценариях работы в X-домене и вне браузера – II (аутентификация с помощью форм).