Работа с двоичными данными (службы WCF Data Services)
Клиентская библиотека Службы WCF Data Services позволяет извлекать и обновлять двоичные данные из канала Протокол Open Data Protocol (OData) одним из следующих способов:
В качестве свойства сущности примитивного типа. Этот метод рекомендуется использовать при работе с небольшими двоичными объектами данных, которые могут быть легко загружены в память. В этом случае двоичное свойство представляет собой свойство сущности, предоставленное моделью данных, служба данных сериализует двоичные данные в ответном сообщении как XML-элемент с двоичной кодировкой с базой 64.
В качестве отдельного потока двоичных данных. Этот метод рекомендуется использовать для доступа и изменения данных больших двоичных объектов, которые могут представлять фото, видео или другие типы данных с двоичной кодировкой. В этом методе двоичные данные не включаются в модель службы данных, предоставляемую каналом OData и запрашиваемую в качестве потока напрямую из службы данных.
Службы Службы WCF Data Services реализуют потоки двоичных данных с помощью HTTP в соответствии с определением в OData . В этом подходе двоичные данные обрабатываются как медиаресурс, отделенный, но при этом связанный с сущностью, которая называется медиассылкой. Дополнительные сведения см. в разделе Потоковый поставщик (службы WCF Data Services).
Метаданные медиассылки
Сущность, являющаяся медиассылкой, указывается атрибутом HasStream в метаданных, возвращаемых метаданными URI службы данных OData , такой как https://localhost:12345/Northwind.svc/$metadata
. В следующем примере сущность Employee
является медиассылкой, у которой имеется связанный медиаресурс. Этот медиаресурс представляет собой битовую карту, которая хранится в столбце Photo
таблицы Employees
в базе данных Northwind в качестве медиаресурса.
<EntityType Name="Employees" m:HasStream="true">
<Key>
<PropertyRef Name="EmployeeID" />
</Key>
<Property Name="EmployeeID" Type="Edm.Int32" Nullable="false" />
<Property Name="LastName" Type="Edm.String" Nullable="false" MaxLength="20" Unicode="true" FixedLength="false" />
<Property Name="FirstName" Type="Edm.String" Nullable="false" MaxLength="10" Unicode="true" FixedLength="false" />
<Property Name="Title" Type="Edm.String" Nullable="true" MaxLength="30" Unicode="true" FixedLength="false" />
<Property Name="TitleOfCourtesy" Type="Edm.String" Nullable="true" MaxLength="25" Unicode="true" FixedLength="false" />
<Property Name="BirthDate" Type="Edm.DateTime" Nullable="true" />
<Property Name="HireDate" Type="Edm.DateTime" Nullable="true" />
<Property Name="Address" Type="Edm.String" Nullable="true" MaxLength="60" Unicode="true" FixedLength="false" />
<Property Name="City" Type="Edm.String" Nullable="true" MaxLength="15" Unicode="true" FixedLength="false" />
<Property Name="Region" Type="Edm.String" Nullable="true" MaxLength="15" Unicode="true" FixedLength="false" />
<Property Name="PostalCode" Type="Edm.String" Nullable="true" MaxLength="10" Unicode="true" FixedLength="false" />
<Property Name="Country" Type="Edm.String" Nullable="true" MaxLength="15" Unicode="true" FixedLength="false" />
<Property Name="HomePhone" Type="Edm.String" Nullable="true" MaxLength="24" Unicode="true" FixedLength="false" />
<Property Name="Extension" Type="Edm.String" Nullable="true" MaxLength="4" Unicode="true" FixedLength="false" />
<Property Name="Notes" Type="Edm.String" Nullable="true" MaxLength="Max" Unicode="true" FixedLength="false" />
<Property Name="PhotoPath" Type="Edm.String" Nullable="true" MaxLength="255" Unicode="true" FixedLength="false" />
<NavigationProperty Name="Employees1" Relationship="NorthwindModel.FK_Employees_Employees" FromRole="Employees" ToRole="Employees1" />
<NavigationProperty Name="Employees2" Relationship="NorthwindModel.FK_Employees_Employees" FromRole="Employees1" ToRole="Employees" />
</EntityType>
В этом случае обратите внимание на то, что свойство Photo
не включается в определение сущности Employee
. Вместо этого доступ к данным Photo
осуществляется как к потоку двоичных данных из службы данных. В остальных примерах этого раздела описываются способы доступа и изменения этого медиаресурса с помощью потока двоичных данных. Файлы проекта из примера потокового приложения можно загрузить на странице Образцы из документации по службам WCF Data Services.
Получение и настройка потока медиаресурса
При получении медиаресурса в видео потока двоичных данных необходимо вызвать метод GetReadStream экземпляра DataServiceContext, который отслеживает эту сущность. Этот метод отправляет запрос службе данных, возвращающей объект DataServiceStreamResponse, который содержит ссылку на поток, содержащий медиаресурс. В следующем примере описывается способ вызова метода GetReadStream для получения битовой карты, принадлежащей определенному сотруднику из службы данных, определенной для предоставления данных в базе данных Northwind:
' Get the read stream for the Media Resource of the currently selected
' entity (Media Link Entry).
Using response As DataServiceStreamResponse = _
context.GetReadStream(currentEmployee, "image/bmp")
' Use the returned binary stream to create a bitmap image that is
' the source of the image control.
employeeImage.Source = CreateBitmapFromStream(response.Stream)
End Using
// Get the read stream for the Media Resource of the currently selected
// entity (Media Link Entry).
using (DataServiceStreamResponse response =
context.GetReadStream(currentEmployee, "image/bmp"))
{
// Use the returned binary stream to create a bitmap image that is
// the source of the image control.
employeeImage.Source = CreateBitmapFromStream(response.Stream);
}
Примечание |
---|
Заголовок Content-Length в ответном сообщении, в котором содержится поток двоичных данных, не заданный службой данных.Это значение может не отражать фактическую длину потока двоичных данных. |
Чтобы вставить или обновить медиаресурс, вызовите метод SetSaveStream для экземпляра DataServiceContext, который отслеживает сущность. Этот метод отправляет запрос службе данных, содержащей медиаресурс, считанный из предоставленного потока. В следующем примере описывается способ вызова метода SetSaveStream для отправки битовой карты, принадлежащей определенному сотруднику, службе данных:
' Use the FileStream to open an existing image file.
Dim imageStream As FileStream = _
New FileStream(openImage.FileName, FileMode.Open)
' Set the file stream as the source of binary stream
' to send to the data service. Allow the context to
' close the filestream.
context.SetSaveStream(currentEmployee, _
imageStream, True, "image/bmp", _
String.Empty)
' Upload the binary stream to the data service.
context.SaveChanges()
// Use the FileStream to open an existing image file.
FileStream imageStream =
new FileStream(openImage.FileName, FileMode.Open);
// Set the file stream as the source of binary stream
// to send to the data service. Allow the context to
// close the filestream.
context.SetSaveStream(currentEmployee,
imageStream, true, "image/bmp",
string.Empty);
// Upload the binary stream to the data service.
context.SaveChanges();
Обратите внимание, что поток не будет отправлен службе данных до вызова SaveChanges.
В этом примере метод SetSaveStream вызывается с помощью присвоения значения true параметру closeStream. Благодаря этому объект DataServiceContext гарантированно закрывает поток после загрузки двоичных данных в службу данных.
См. также
Основные понятия
Привязка данных к элементам управления (службы WCF Data Services)