Creare un servizio WCF che invia e riceve array byte - Parte 1

Articolo riguardante la gestione dei file nei servizi WCF tramite linguaggio VB.Net e C#.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

 In questo articolo vedremo come creare un servizio di tipo “Windows Comunication Foundation” WCF con il quale avere un metodo che restituisce un array di byte (byte[]) ed un altro metodo che ha un parametro da passare come array di byte.

Può tornare utile in quei scenari nel quale trasferire file tra due server.
Articolo fornirà al lettore le informazioni e la conoscenza di come implementare un servizio di tipo WCF per l’invio e la ricezione riguardante il flusso di file, utile per trasmettere i file da diversi sistemi.
L’architettura che verrà implementata sarà un servizio WCF, un’applicazione semplice di tipo Asp.Net tradizionale, e l’uso dei linguaggi di programmazione VB.Net e C#.


Creazione del progetto

Si crea un nuovo progetto di tipo web application con il linguaggio di proprio interesse, applicazione di tipo Asp.Net tradizionale, come riportato in figura 1.

Figura 1 – la creazione del progetto di tipo Asp.Net


Dopo aver creato il progetto, aggiungere una pagina web, Asp.Net tradizionale, nel quale andremo ad inserire due pulsanti.
I pulsanti avranno il compito di inviare l’array di byte al servizio in modo da creare il file, ed un altro di ricevere l’array di byte, in modo da creare un array di byte sulla pagina Asp.Net
Il tutto come mostrato in figura 2.

Figura 2 – La creazione della pagina


Ora che abbiamo creato la nostra pagina di esempio per simulare l’utilizzo dell’invio e ricezione del flusso dei file, dobbiamo creare un progetto di servizio WCF.
Nella finestra esplora soluzioni si crea un nuovo progetto facendo click con il tasto destro sul nome della soluzione.
Si crea un nuovo progetto, selezionando il modello denominato “Applicazione del servizio WCF” della categoria “WCF” come mostrato in figura 3.

Figura 3 – La creazione del servizio


A questo punto dobbiamo implementare il servizio creando i due metodi, uno per l’invio ed un altro per la ricezione.


Stesura del codice


Dopo aver creato l’architettura e predisposti i progetti, occorre scrivere il codice.
La prima fase riguarderà la stesura di codice per i servizi WCF creando i due metodi.
Andiamo nel file “Service1” e nella dichiarazione dei metodi scriviamo il metodo per la ricezione del flusso dati di un file.
Il metodo ha il compito di leggere un file, ossia restituire un arrayByte che riguarda un determinato file, utilizzando il metodo “ReadAllBytes” della Classe File, per questo dobbiamo aggiungere lo spazio dei nomi per la gestione dei file.
Qui di seguito la dichiarazione per entrambi i linguaggi.

VB.Net
Imports System.IO
C#
using System.IO;

A questo punto possiamo scrivere il metodo che restituisce l’array byte del file.

Qui di seguito si riporta il frammento del codice per i linguaggi VB.Net e C#

VB.Net
public byte[] GetDati() Implements IService1.GetDati
{
try
{
byte[] returnValore = File.ReadAllBytes("D:\\MioFile.jpg");
return returnValore;
}
catch (Exception ex)
{
//gestione errore
return null;
}
}
C#
public  byte[] GetDati()
{
try
{
byte[] returnValore = File.ReadAllBytes("D:\\MioFile.jpg");
return returnValore;
}
catch (Exception ex)
{
//gestione errore
return null;
}
}

Nei servizi WCF, dobbiamo anche modificare la classe interfaccia, quindi nel file denominato “IService1” scriviamo il metodo relativo al metodo precedente.

Qui di seguito si riporta le dichiarazioni del metodo per i linguaggi VB.Net e C#.

VB.Net
<OperationContract()>
Function GetDati() As Byte()
C#
[OperationContract]
byte[] GetDati();

Ora che abbiamo creato il metodo, non ci resta che aggiungerlo nei riferimenti del nostro progetto Web.
In esplora soluzione, fate click con il tasto destro sulla voce “Riferimenti” e dal menu che viene visualizzato, selezionate la voce “Riferimento al servizio” ed assegnate un nome, il tutto come mostrato in figura 4.

Figura 4 – L’Aggiunta del servizio al progetto web

Confermate tutto tramite il pulsante “OK”, in questo modo verrà aggiunto al progetto il riferimento al servizio creato in precedenza.
Facciamo doppio click sul pulsante “Ricevi” in modo che utilizziamo il metodo per ricevere il flusso dati del file.
In visualizzazione codice, nell’evento click del pulsante dobbiamo scrivere il codice che richiama il metodo appena creato e crea un file sul nostro pc, ed apre il file.


Qui di seguito si riporta il codice completo per entrambi i linguaggi di programmazione per la creazione del file sulla parte web.

VB.Net
Protected Sub BtnRicevi_Click(sender As Object, e As EventArgs) Handles BtnRicevi.Click
Try
Dim ServizioDati As New WsDati.Service1Client
Dim fileByte As Byte() = ServizioDati.GetDati()
File.WriteAllBytes("D:\NuovoFile.jpg", fileByte)
System.Diagnostics.Process.Start("D:\NuovoFile.jpg")
Catch ex As Exception
Response.Write("Errore: " + ex.Message)
'Errore: È stata superata la quota massima delle dimensioni per i messaggi in ingresso (65536). Per aumentare la quota, utilizzare la proprietà MaxReceivedMessageSize nell'elemento associazione appropriato.
End Try
End Sub
C#
protected void BtnRicevi_Click(object sender, EventArgs e)
{
try
{
WSDati.Service1Client ServizioDati = new WSDati.Service1Client();
byte[] file =  ServizioDati.GetDati();
File.WriteAllBytes("D:\\NuovoFile.jpg", file);
System.Diagnostics.Process.Start("D:\\NuovoFile.jpg");
}
catch (Exception ex)
{
Response.Write("Errore: " + ex.Message);
//Errore: È stata superata la quota massima delle dimensioni per i messaggi in ingresso (65536). Per aumentare la quota, utilizzare la proprietà MaxReceivedMessageSize nell'elemento associazione appropriato.
}
}

Se viene eseguito il codice , verrà generato un errore., di tipo “È stata superata la quota massima delle dimensioni per i messaggi in ingresso (65536). Per aumentare la quota, utilizzare la proprietà MaxReceivedMessageSize nell'elemento associazione appropriato.”

Dobbiamo impostare nel file di configurazione del nostro progetto web, alcuni parametri per la ricezione in particolare nel tag binding e l’aggiunta del tag Behaviors.
Quindi dai parametri di default che sono:

<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService1" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:2063/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService1" contract="WsDati.IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>

Diventerà

<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService1"  closeTimeout="00:10:00"
openTimeout="00:10:00" sendTimeout="00:10:00" maxBufferPoolSize="2147483647"
maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"
transferMode="Streamed">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceTypeBehaviors">
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<client>
<endpoint address="http://localhost:2063/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService1" contract="WsDati.IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>

Ora non resta che testare l'applicazione e vedremo il corretto funzionamento.

Conclusione

Termina la prima parte di quetso articolo, nel quale il lettore ha acquisito quella conoscenza della realizzazione ed utilizzo dei servizi WCF che fanno uso dei file. In particolare si è visto come ricevere un flusso dati per la creazione di un file passando da un servizio WCF ad una pagina Asp.NEt.

Nel prossimo articolo conclusivo, vedremo come inviare un file o meglio array di byte.