Web Services, Remoting, WSE2: pregi e difetti

4 pagine in totale: <<Indietro 1 2 [3] 4 Avanti >>

Web services Enhancements 2

Vediamo l'ultima tecnica che il .NET Framework mette a disposizione, i WSE . Questa giovane tecnologia, giusta alla versione 2, potenzia notevolmente l'implementazione di base dei web services aggiungendo interessanti potenzialità, come la possibilità di utilizzare anche la trasmissione binaria, funzioni per la crittografazione, per la sicurezza e molto altro. Per maggiori info consiglio una visita alla sezione dedicata all'argomento direttamente dall'MSDN della Microsoft.

L'implementazione di un web service di questo tipo nella nostra applicazione non è molto diversa da quanto si fa tradizionalmente.
Dobbiamo inserire la "web references" per essa da Visual Studio o con il comando "wsdl.exe", ma per poter utilizzare le nuove potenzialità che ci mette a disposizione dobbiamo configurare la nostra applicazione nel modo appropriato.
Innanzitutto, non essendo il WSE 2 inserito nella dotazione normale del Framework, dobbiamo scaricare e installare sul computer il pacchetto necessario da questo link . Una volta installato anche il supporto per Visual Studio .NET 2003, selezionando la voce "proprietà" dalla web application in cui vogliamo utilizzare questo tipo di web services avremo una schermata simile alla seguente, diversa dal solito:

Immagine

Selezionando questa voce apparirà una finestra dove specificare le varie opzioni per l'implementazione di WSE2:

Immagine

Una volta specificato che l'applicazione dovrà implementare questi nuovi web services, automaticamente sarà modificato il web.config per l'implementazione degli assembly necessari al funzionamento:

<configuration>
   <configSections>
      <section name="microsoft.web.services2"  type="Microsoft.Web.Services2.Configuration.WebServicesConfiguration,  Microsoft.Web.Services2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"  />
   </configSections>
   <system.web>
      <webServices>
         <soapExtensionTypes>
            <add type="Microsoft.Web.Services2.WebServicesExtension,  Microsoft.Web.Services2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"  priority="1" group="0" />
         </soapExtensionTypes>
      </webServices>
   </system.web>
   <microsoft.web.services2>
      <diagnostics />
   </microsoft.web.services2>
</configuration>
private void Button3_Click(object sender, System.EventArgs e)
{
   try
   {
      ServizioEsterno2.UploadFile2Wse  up=new Esempio.ServizioEsterno2.UploadFile2Wse();
      DimeAttachment da=new DimeAttachment(
         Path.GetFileName(xfile.PostedFile.FileName),
         "application/octet-stream",
         TypeFormat.MediaType,
         xfile.PostedFile.InputStream
         );
      up.RequestSoapContext.Attachments.Add(da);
      if (up.InviaFile())
         Label1.Text="OK!";
      else
         Label1.Text="NOOO";
   }
   catch (Exception ex)
   {
      Label1.Text=ex.ToString();
   }
}

La classe del web service è stata istanziata con un nome leggermente diverso: "UploadFile2Wse" invece di "UploadFile2".
Questo è dovuto all'utilizzo di WSE: per poter utilizzare le nuove potenzialità offerte da queste classi, è creata una copia della classe del web service originale con l'aggiunta al nome della classe del suffisso "Wse".

Dopo la dichiarazione della classe del web service viene istanziata la classe "DimeAttachment". Questo nuovo oggetto è una delle novità del WSE e permette di inserire file in formato binario nella trasmissione SOAP senza toccare il codice del web service.
Sarà inserito alla fine del messaggio in formato SOAP consentendo in questo modo una trasmissione "mista". Nella dichiarazione di questo oggetto possiamo inserire lo stream dove prelevare il file, il content-type, il tipo di formato.

Ora vediamo il codice del web service naturalmente decurtato dall'inutile per le spiegazioni:

using System;
using System.Web.Services;
using Microsoft.Web.Services2;
using Microsoft.Web.Services2.Dime;

namespace WebService2
{
   [WebService(Namespace = "urn:schemas:Upload2")]
   public class UploadFile2 : System.Web.Services.WebService
   {
      [WebMethod]
          public bool InviaFile()
      {
         const int  BUFFER_SIZE=32768; // 32K buffer

         SoapContext  current=RequestSoapContext.Current;
         if (current==  null)
            throw new ApplicationException("Only soap request allowed");

         // Se non ci  sono file allegati torna false
         if (current.Attachments.Count  == 0) return false;

         DimeAttachment da = current.Attachments[0] as DimeAttachment;

         // Lo salvo  su disco
         string  fileName = String.Format(@"{0}{1}",
            ConfigurationSettings.AppSettings["percorso"],
            da.Id);

         // Copio  stream su file
         using (FileStream  file = new FileStream(fileName, FileMode.Create, FileAccess.Write,  FileShare.None, BUFFER_SIZE))
         {
            byte[] buffer = new byte[BUFFER_SIZE];

            int len;
            while ( (len=da.Stream.Read (buffer, 0, BUFFER_SIZE)) > 0)
               file.Write (buffer, 0, len);

            file.Flush();
         }
         return true;
      }
   }
}

Innanzitutto viene preso il context del messaggio SOAP corrente, quindi viene controllato che in esso sia presente un "attachment" e in caso positivo viene salvato su disco prelevando lo stream contenente il file e altre informazioni, come il nome dello stesso, direttamente dall'oggetto "DimeAttachment".

Un ringraziamento per la tecnica qui utilizzava va naturalmente ad un articolo di Cristian Civera a cui mi sono ispirato per questa sezione.

4 pagine in totale: <<Indietro 1 2 [3] 4 Avanti >>

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.


TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC