Поделиться через


Работа с двоичными данными (службы 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);
}
Ee473426.note(ru-ru,VS.100).gifПримечание
Заголовок 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)

Другие ресурсы

Клиентская библиотека служб WCF Data Services