domenica 27 ottobre 2019

.Net servizio WCF che invia e riceve array byte - Parte 1

Si riporta l'articolo scritto per il sito https://www.iprogrammatori.it/articoli/microsoft-net-framework/art_net-wcf-creare-un-servizio-che-invia-e-r_1636.aspx

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.

Nessun commento: