Condividi tramite


Utilizzo di dati binari (WCF Data Services)

La libreria client WCF Data Services consente di recuperare e aggiornare i dati binari da un feed OData (Open Data Protocol) in una delle modalità seguenti:

  • Come proprietà di tipo primitivo di un'entità. Si tratta del metodo consigliato per l'utilizzo di oggetti dati binari di dimensioni ridotte che possono essere caricati facilmente in memoria. In questo caso, la proprietà binaria è una proprietà dell'entità esposta dal modello di dati e il servizio dati serializza i dati binari come codice XML binario in base 64 nel messaggio di risposta.

  • Come flusso separato di risorse binarie. Si tratta del metodo consigliato per l'accesso e la modifica di dati di oggetti binari di grandi dimensioni (BLOB) che possono rappresentare una foto, un video o qualsiasi altro tipo di dati codificati binari.

WCF Data Services implementa il flusso di dati binari tramite HTTP come definito nel protocollo OData. OData fornisce i meccanismi di flusso seguenti per associare dati binari a un'entità:

  • Risorsa multimediale/voce di collegamento multimediale

    Il protocollo di pubblicazione Atom (AtomPub) definisce un meccanismo per associare i dati binari come una risorsa multimediale a una voce in un feed di dati, definita voce di collegamento multimediale. Può essere presente solo una risorsa multimediale definita per una voce di collegamento multimediale specificata. Una risorsa multimediale può essere considerata come il flusso predefinito per un'entità. OData eredita questo comportamento di flusso da AtomPub.

  • Flusso di risorse denominato

    A partire dalla versione 3 di OData un'entità può contenere più flussi di risorse correlati, a cui è possibile accedervi in base al nome. Questo meccanismo non dipende da AtomPub, pertanto è possibile che un'entità contenga flussi di risorse denominati ma non sia una voce di collegamento multimediale. È inoltre possibile che una voce di collegamento multimediale contenga flussi denominati. Per ulteriori informazioni, vedere Provider di flusso (WCF Data Services).

Metadati dell'entità

Un'entità che contiene flussi di risorse multimediali correlati viene indicata nei metadati del servizio dati in uno dei modi seguenti, a seconda del tipo di flusso:

  1. Risorsa multimediale:

    Mediante l'attributo HasStream di un tipo di entità che rappresenta la voce di collegamento multimediale.

  2. Flusso di risorse denominato:

    Mediante una o più proprietà di un'entità nel modello dati con tipo di dati Stream.

    Il supporto del tipo di dati Stream nel modello di dati richiede la versione 2.2 di EDM. Per ulteriori informazioni, vedere Streaming Provider (WCF Data Services).

Nell'esempio seguente l'entità PhotoInfo è una voce di collegamento multimediale che contiene di una risorsa multimediale correlata, indicata dall'attributo HasStream, e un flusso di risorse denominato, definito Thumbnail.

<EntityType Name="PhotoInfo" m:HasStream="true">
  <Key>
    <PropertyRef Name="PhotoId" />
  </Key>
  <Property Name="PhotoId" Type="Edm.Int32" Nullable="false" 
            p9:StoreGeneratedPattern="Identity" 
            xmlns:p9="https://schemas.microsoft.com/ado/2009/02/edm/annotation" />
  <Property Name="FileName" Type="Edm.String" Nullable="false" />
  <Property Name="FileSize" Type="Edm.Int32" Nullable="true" />
  <Property Name="DateTaken" Type="Edm.DateTime" Nullable="true" />
  <Property Name="TakenBy" Type="Edm.String" Nullable="true" />
  <Property Name="DateAdded" Type="Edm.DateTime" Nullable="false" />
  <Property Name="Exposure" Type="PhotoData.Exposure" Nullable="false" />
  <Property Name="Dimensions" Type="PhotoData.Dimensions" Nullable="false" />
  <Property Name="DateModified" Type="Edm.DateTime" Nullable="false" />
  <Property Name="Comments" Type="Edm.String" Nullable="true" MaxLength="Max" 
            Unicode="true" FixedLength="false" />
  <Property Name="ContentType" Type="Edm.String" Nullable="true" MaxLength="50" 
            Unicode="true" FixedLength="false" />
  <Property Name="Thumbnail" Type="Edm.Stream" Nullable="false" />
</EntityType>

Negli esempi restanti di questo argomento viene illustrato come accedere e modificare il flusso di risorsa multimediale. Per un esempio completo su come utilizzare un flusso di risorsa multimediale in un'applicazione client .NET Framework tramite la libreria client WCF Data Services, vedere l'argomento Accesso al flusso di risorsa multimediale dal client.

Accesso ai flussi di risorse binari

La libreria client WCF Data Services fornisce i metodi per l'accesso ai flussi di risorse binarie da un servizio dati basato su OData. Quando si scarica una risorsa multimediale, è possibile utilizzare l'URI della risorsa multimediale od ottenere un flusso binario contenente i dati della risorsa multimediale. È possibile caricare i dati della risorsa multimediale anche come un flusso binario.

Suggerimento

Per un esempio dettagliato di come creare un'applicazione client Windows Presentation Foundation (WPF) che scarica file di immagine binari da un servizio OData che archivia foto, vedere l'argomento Serie provider di flusso di servizi dati: accesso a un flusso di risorsa multimediale dal client (parte 2).Per scaricare il codice di esempio per il servizio dati di foto di flusso rappresentato nel post di blog, vedere Esempio di servizio dati di foto di flusso in MSDN Code Gallery.

Recupero dell'URI del flusso binario

Quando si recuperano determinati tipi di risorse multimediali, ad esempio immagini e altri file multimediali, è spesso più semplice utilizzare l'URI della risorsa multimediale nell'applicazione anziché gestire il flusso di dati binari. Per ottenere l'URI di un flusso di risorsa associato a una data voce di collegamento multimediale, è necessario chiamare il metodo GetReadStreamUri(Object) sull'istanza DataServiceContext che tiene traccia dell'entità. Per ottenere l'URI di un flusso di risorse denominato, chiamare l'overload del metodo che accetta il parametro name, che rappresenta il nome del flusso. Nell'esempio seguente viene mostrato come chiamare il metodo GetReadStreamUri(Object) per ottenere l'URI di un flusso di risorsa multimediale utilizzato per creare una nuova immagine nel client:

' Use the ReadStreamUri of the Media Resource for selected PhotoInfo object
' as the URI source of a new bitmap image.
photoImage.Source = New BitmapImage(context.GetReadStreamUri(currentPhoto))
// Use the ReadStreamUri of the Media Resource for selected PhotoInfo object
// as the URI source of a new bitmap image.
photoImage.Source = new BitmapImage(context.GetReadStreamUri(currentPhoto));

Per i flussi di risorse denominati è possibile ottenere anche l'URI del flusso direttamente dalla proprietà del flusso. Per ogni proprietà della voce di collegamento multimediale restituita dai metadati del servizio dati di tipo Stream, generare negli strumenti del servizio dati una proprietà che restituisca un'istanza DataServiceStreamLink. La proprietà Uri di questo oggetto DataServiceStreamLink è l'URI del flusso di risorse denominato. Ciò consente di ottenere l'URI direttamente dall'oggetto della voce di collegamento multimediale o come risultato di una query LINQ (Language Integrated Query).

Download del flusso di risorsa binaria

Quando si recupera un flusso di risorsa binaria, è necessario chiamare il metodo GetReadStream sull'istanza di DataServiceContext che tiene traccia della voce di collegamento multimediale. Questo metodo invia una richiesta al servizio dati che restituisce un oggetto DataServiceStreamResponse che presenta un riferimento al flusso contenente la risorsa. Utilizzare questo metodo quando l'applicazione richiede la risorsa binaria come Stream. Quando si accedere a un flusso di risorse denominato, chiamare l'overload del metodo che accetta il parametro name, che rappresenta il nome del flusso di risorse. Nell'esempio seguente viene mostrato come chiamare il metodo GetReadStream per recuperare un flusso utilizzato per creare una nuova immagine nel client:

' 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);
}

Nota

L'intestazione Content-Length nel messaggio di risposta che contiene il flusso binario non è impostata dal servizio dati.È possibile che questo valore non rifletta la lunghezza effettiva del flusso di dati binari.

Caricamento di una risorsa multimediale come flusso

Per inserire o aggiornare una risorsa multimediale, chiamare il metodo SetSaveStream sull'istanza DataServiceContext che tiene traccia dell'entità. Questo metodo invia una richiesta al servizio dati che contiene la risorsa multimediale letta dal flusso fornito. Quando si carica un flusso di risorse denominato, chiamare l'overload del metodo che accetta il parametro name, che rappresenta il nome del flusso di risorse. Nell'esempio seguente viene mostrato come chiamare il metodo SetSaveStream per inviare al servizio dati un'immagine bitmap che appartiene a un dipendente specifico:

' Set the file stream as the source of binary stream 
' to send to the data service. The Slug header is the file name and
' the content type is determined from the file extension. 
' A value of 'true' means that the stream is closed by the client when 
' the upload is complete.
context.SetSaveStream(photoEntity, imageStream, True, _
    photoEntity.ContentType, photoEntity.FileName)
// Set the file stream as the source of binary stream 
// to send to the data service. The Slug header is the file name and
// the content type is determined from the file extension. 
// A value of 'true' means that the stream is closed by the client when 
// the upload is complete.
context.SetSaveStream(photoEntity, imageStream, true,
    photoEntity.ContentType, photoEntity.FileName);

In questo esempio il metodo SetSaveStream viene chiamato fornendo un valore true per il parametro closeStream. Ciò garantisce che DataServiceContext chiuda il flusso dopo aver caricato i dati binari nel servizio dati.

Nota

Quando si chiama SetSaveStream(Object, String, Stream, Boolean, String), il flusso non viene inviato al servizio dati fino a quando non viene chiamato il metodo SaveChanges.

Vedere anche

Concetti

Associazione di dati a controlli (WCF Data Services)

Altre risorse

Client dati (WCF Data Services)