Linee guida per la progettazione di servizi Web XML creati con ASP.NET

I servizi Web XML rappresentano una potente tecnologia che consente di offrire servizi a cui è possibile accedere a livello di codice tramite Internet. Per creare servizi efficienti, attenersi ai consigli seguenti:

  • I servizi Web XML supportano la comunicazione sincrona e asincrona tra i client e il server host del servizio. In comunicazione sincrona, il client invia la richiesta per un servizio al server host del servizio e attende la risposta. In tal modo il client non esegue altre operazioni durante l'attesa dei risultati. In comunicazione asincrona, invece, il client continua a eseguire altre attività durante l'attesa dei risultati e risponde al risultato della richiesta quando questo è disponibile.

    Quando si utilizza lo Strumento del linguaggio di descrizione dei servizi Web (Wsdl.exe) per creare una classe proxy, vengono generate le versioni standard, sincrone e asincrone dei metodi nella classe. Le versioni asincrone sono composte da due metodi denominati Begin ed End. Il metodo Begin viene utilizzato per iniziare il servizio Web XML, mentre il metodo End recupera i risultati.

    La comunicazione asincrona consente di migliorare l'utilizzo del sistema e di evitare ritardi sul client durante l'attesa dei risultati del servizio Web XML.

    Nell'esempio di codice seguente viene descritta l'esecuzione di una chiamata asincrona a un servizio Web XML da parte di un'applicazione client.

    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Net" %>
    <html>
       <script language="C#" runat="server">
          void EnterBtn_Click(Object Src, EventArgs E) 
          {
             MyMath.Math math = new MyMath.Math();
             // Call to Add XML Web service method asynchronously 
             // and then wait for it to complete.
             IAsyncResult result =
                             math.BeginAdd(Convert.ToInt32(Num1.Text),
                                           Convert.ToInt32(Num2.Text),
                                           null,
                                           null);
             // Wait for asynchronous call to complete.
             result.AsyncWaitHandle.WaitOne();
             // Complete the asynchronous call to Add XML Web service method.
             float total = math.EndAdd(result);
             // Display results in a Label control.
             Total.Text = "Total: " + total.ToString();
          }
       </script>
    <body>
       <form action="MathClient.aspx" runat=server>
          <font face="Verdana"> 
             Enter the two numbers you want to add and then press 
             the Total button.
             <p>
             Number 1: 
             <asp:textbox id="Num1" 
             runat=server/>  
             +
             Number 2: 
             <asp:textbox id="Num2" 
                  runat=server/> 
             =
             <asp:button id="Total_Button"
                  text="Total" 
                  OnClick="EnterBtn_Click" 
                  runat=server/>
             <p>
             <asp:label id="Total" runat=server/>
          </font>
        </form>
    </body>
    </html>
    [Visual Basic]
    <%@ Page Language="VB" %>
    <%@ Import Namespace="System.Net" %>
    <html>
       <script language="VB" runat="server">
          Sub EnterBtn_Click(Src As Object, E As EventArgs) 
             Dim math As New MyMath.Math()
             ' Call to Add XML Web service method asynchronously 
             ' and then wait for it to complete.
             Dim result As IAsyncResult = _
                             math.BeginAdd(Convert.ToInt32(Num1.Text), _
                                           Convert.ToInt32(Num2.Text), _
                                           Nothing, _
                                           Nothing)
    
             ' Wait for asynchronous call to complete.
             result.AsyncWaitHandle.WaitOne()
             ' Complete the asynchronous call to Add XML Web service method.
             Dim addtotal As Single = math.EndAdd(result)
             ' Display results in a Label control.
             Total.Text = "Total: " & addtotal.ToString()
          End Sub
       </script>
    <body>
       <form action="MathClient.aspx" runat=server>
          <font face="Verdana"> 
             Enter the two numbers you want to add and then press 
             the Total button.
             <p>
             Number 1: 
             <asp:textbox id="Num1" 
             runat=server/>  
             +
             Number 2: 
             <asp:textbox id="Num2" 
                  runat=server/> 
             =
             <asp:button id="Total_Button"
                  text="Total" 
                  OnClick="EnterBtn_Click" 
                  runat=server/>
             <p>
             <asp:label id="Total" runat=server/>
          </font>
        </form>
    </body>
    </html>
    

    Per ulteriori informazioni sulla comunicazione sincrona, vedere Comunicazione asincrona con servizi Web XML.

  • L'esecuzione di numerose richieste di servizio tramite Internet può ridurre le prestazioni dell'applicazione client. Nella progettazione del servizio Web XML, utilizzare in modo efficiente le richieste di servizio creando metodi che raggruppano informazioni correlate. Se, ad esempio, un servizio Web XML recupera informazioni su un libro, anziché utilizzare metodi diversi per recuperare informazioni su titolo, autore ed editore, è possibile creare un metodo che restituisce tutte queste informazioni in un'unica richiesta. Il trasferimento contemporaneo di un unico blocco di informazioni di dimensioni elevate è più efficiente rispetto al trasferimento di più blocchi di informazioni di dimensioni minori.

    Nell'esempio di codice seguente viene descritto il raggruppamento delle informazioni correlate in un unico metodo di servizio Web XML.

    <%@ WebService Language="C#" Class="DataService" %>
    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Web.Services;
    public class DataService {
       [WebMethod]
       public DataSet GetTitleAuthors() {
            SqlConnection myConnection = new SqlConnection("Persist Security Info=False;Integrated Security=SSPI;server=localhost;database=pubs");
            SqlDataAdapter myCommand1 = new SqlDataAdapter ("select * from Authors", myConnection);
            SqlDataAdapter myCommand2 = new SqlDataAdapter("select * from Titles", myConnection);
            DataSet ds = new DataSet();
            myCommand1.Fill(ds, "Authors");
            myCommand2.Fill(ds, "Titles");
            return ds;
       }
    }
    [Visual Basic]
    <%@ WebService Language="VB" Class="DataService" %>
    Imports System
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Web.Services
    Public Class DataService   
        <WebMethod> _
        Public Function GetTitleAuthors() As DataSet
            Dim myConnection As New SqlConnection("Persist Security Info=False;Integrated Security=SSPI;server=localhost;database=pubs")
            Dim myCommand1 As New SqlDataAdapter("select * from Authors", myConnection)
            Dim myCommand2 As New SqlDataAdapter("select * from Titles", myConnection)
            Dim ds As New DataSet()
            myCommand1.Fill(ds, "Authors")
            myCommand2.Fill(ds, "Titles")
            Return ds
        End Function
    End Class
    
  • Utilizzare metodi standard di programmazione orientata ad oggetti nella progettazione del servizio Web XML. Utilizzare l'incapsulamento per nascondere i dettagli di implementazione. Nel caso di servizi Web XML più complessi, è possibile utilizzare l'ereditarietà e il polimorfismo per riutilizzare il codice e semplificare la progettazione.

    Nell'esempio di codice seguente viene descritto l'utilizzo dell'ereditarietà per creare un servizio Web XML che esegue calcoli matematici.

    <%@ WebService Language="C#" Class="Add" %>
    using System;
    using System.Web.Services;
    abstract public class MathService : WebService 
    {
       [WebMethod]
       abstract public float CalculateTotal(float a, float b);
    }
    public class Add : MathService 
    {
       [WebMethod]
       override public float CalculateTotal(float a, float b)
       {
           return a + b;
       }
    }
    public class Subtract : MathService 
    {
       [WebMethod]
       override public float CalculateTotal(float a, float b)
       {
           return a - b;
       }
    }
    public class Multiply : MathService 
    {
       [WebMethod]
       override public float CalculateTotal(float a, float b)
       {
           return a * b;
       }
    }
    public class Divide : MathService 
    {
       [WebMethod]
       override public float CalculateTotal(float a, float b)
       {
           if (b==0) 
              return -1;
           else
              return a / b;
       }
    }
    [Visual Basic]
    <%@ WebService Language="VB" Class="Add" %>
    Imports System
    Imports System.Web.Services
    MustInherit Public Class MathService : Inherits WebService    
        <WebMethod> _
        Public MustOverride Function CalculateTotal(a As Single, _
                            b As Single) As Single
    End Class
    Public Class Add : Inherits MathService    
        <WebMethod> _
        Public Overrides Function CalculateTotal(a As Single, _
                         b As Single) As Single
            Return a + b
        End Function
    End Class 
    Public Class Subtract : Inherits MathService
        <WebMethod> _
        Public Overrides Function CalculateTotal(a As Single, _
                         b As Single) As Single
            Return a - b
        End Function
    End Class 
    Public Class Multiply : Inherits MathService
        <WebMethod> _
        Public Overrides Function CalculateTotal(a As Single, _
                         b As Single) As Single
            Return a * b
        End Function
    End Class 
    Public Class Divide : Inherits MathService
        <WebMethod> _
        Public Overrides Function CalculateTotal(a As Single, _
                         b As Single) As Single
            If b = 0 Then
                Return - 1
            Else
                Return a / b
            End If
        End Function
    End Class
    
  • Utilizzare i meccanismi di memorizzazione nella cache di output per migliorare le prestazioni del servizio Web XML. Se la memorizzazione nella cache di output è attivata, i risultati della richiesta di un servizio vengono memorizzati nella cache di output per l'intervallo specificato. Quando viene eseguita una richiesta simile di servizio Web XML, il risultato può essere ottenuto dalla cache, anziché essere calcolato di nuovo. In tal modo viene migliorato il tempo di risposta del servizio Web XML in quanto viene ridotta l'elaborazione da parte del server del servizio Web XML. La memorizzazione nella cache può essere eseguita sia sul client che sul server. La proprietà Duration consente di specificare l'intervallo di memorizzazione nella cache di output di un servizio Web XML.

    La direttiva per l'attivazione della memorizzazione nella cache di output sul client è la seguente:

    <%@ OutputCache Duration="60" %>
    

    Nell'esempio di codice seguente viene descritto l'utilizzo della proprietà Duration sull'applicazione client per specificare un intervallo di 60 secondi per la memorizzazione nella cache di output.

    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Net" %>
    <%@ OutputCache Duration="60" VaryByParam="none" %>
    <html>
       <script language="C#" runat="server">
          void EnterBtn_Click(Object Src, EventArgs e) 
          {
             MyMath.Math math = new MyMath.Math();
             // Call the XML Web service.
             float total = math.Add(Convert.ToInt32(Num1.Text),
                                  Convert.ToInt32(Num2.Text));
             // Display the results in a Label control.
             Total.Text = "Total: " + total.ToString();
          }
       </script>
    <body>
       <form action="MathClient.aspx" runat=server>
          <font face="Verdana"> 
             Enter the two numbers you want to add and press 
             the Total button.
             <p>
             Number 1: 
             <asp:textbox id="Num1" 
             runat=server/>  
             +
             Number 2: 
             <asp:textbox id="Num2" 
                  runat=server/> 
             =
             <asp:button id="Total_Button"
                  text="Total" 
                  OnClick="EnterBtn_Click" 
                  runat=server/>
             <p>
             <asp:label id="Total" runat=server/>
          </font>
        </form>
    </body>
    </html>
    [Visual Basic]
    <%@ Page Language="VB" %>
    <%@ Import Namespace="System.Net" %>
    <%@ OutputCache Duration="60" VaryByParam="none" %>
    <html>
       <script language="VB" runat="server">
          Sub EnterBtn_Click(Src As Object, e As EventArgs) 
             Dim math As New MyMath.Math()
             ' Call the XML Web service.
             Dim addtotal As Single = math.Add(Convert.ToInt32(Num1.Text), _
                                  Convert.ToInt32(Num2.Text))
             ' Display the results in a Label control.
             Total.Text = "Total: " & addtotal.ToString()
          End Sub
       </script>
    <body>
       <form action="MathClient.aspx" runat=server>
          <font face="Verdana"> 
             Enter the two numbers you want to add and press 
             the Total button.
             <p>
             Number 1: 
             <asp:textbox id="Num1" 
             runat=server/>  
             +
             Number 2: 
             <asp:textbox id="Num2" 
                  runat=server/> 
             =
             <asp:button id="Total_Button"
                  text="Total" 
                  OnClick="EnterBtn_Click" 
                  runat=server/>
             <p>
             <asp:label id="Total" runat=server/>
          </font>
        </form>
    </body>
    </html>
    

    È possibile inoltre utilizzare la proprietà CacheDuration della classe Attribute WebMethod per attivare la memorizzazione nella cache sul server. Nell'esempio di codice seguente viene descritto l'utilizzo della proprietà CacheDuration su metodi dei servizi Web XML per specificare un intervallo di 60 secondi per la memorizzazione nella cache di output.

    <%@ WebService Language="C#" Class="MathService" %>
    using System;
    using System.Web.Services;
    public class MathService : WebService {
       [WebMethod(CacheDuration=60)]
       public float Add(float a, float b)
       {
           return a + b;
       }
       [WebMethod(CacheDuration=60)]
       public float Subtract(float a, float b)
       {
           return a - b;
       }
       [WebMethod(CacheDuration=60)]
       public float Multiply(float a, float b)
       {
           return a * b;
       }
       [WebMethod(CacheDuration=60)]
       public float Divide(float a, float b)
       {
           if (b==0) return -1;
           return a / b;
       }
    }  
    [Visual Basic]
    <%@ WebService Language="VB" Class="MathService" %>
    Imports System
    Imports System.Web.Services
    Public Class MathService
        Inherits WebService 
        <WebMethod(CacheDuration := 60)> _
        Public Function Add(a As Single, b As Single) As Single
            Return a + b
        End Function
    
        <WebMethod(CacheDuration := 60)> _
        Public Function Subtract(a As Single, b As Single) As Single
            Return a - b
        End Function
    
        <WebMethod(CacheDuration := 60)> _
        Public Function Multiply(a As Single, b As Single) As Single
            Return a * b
        End Function
    
        <WebMethod(CacheDuration := 60)> _
        Public Function Divide(a As Single, b As Single) As Single
            If b = 0 Then
                Return - 1
            End If
            Return a / b
        End Function
    End Class
    
  • Nella progettazione del servizio Web XML, cercare di seguire la struttura di formattazione di uno schema.

  • I servizi Web XML utilizzano il protocollo SOAP come protocollo principale di trasmissione e serializzazione. I messaggi SOAP sono composti da un insieme facoltativo di intestazioni e dal corpo del messaggio. La sezione di intestazione include informazioni che possono essere elaborate dall'infrastruttura sul server Web. SOAP non definisce alcuna intestazione. La sezione del corpo del messaggio, invece, include informazioni elaborate da un'applicazione, quali i parametri o il valore restituito per un servizio Web XML.

    Per ulteriori informazioni sull'utilizzo delle intestazioni SOAP, vedere Utilizzo di intestazioni SOAP.

  • Fornire sempre la documentazione per il servizio Web XML, ad esempio un file HTML statico, in cui viene descritto il funzionamento del servizio e le strutture di dati. Includere inoltre esempi di utilizzo del servizio Web XML. Non utilizzare la descrizione o la pagina della Guida del servizio come uniche fonti di documentazione.

Vedere anche

Generazione di servizi Web XML mediante ASP.NET | Comunicazione asincrona con servizi Web XML | Utilizzo delle intestazioni SOAP