Indications de design pour les services Web XML créés à l'aide d'ASP.NET
Les services Web XML sont une technologie puissante de fourniture de services accessibles par programme sur Internet. Les recommandations suivantes vous aideront à créer des services Web XML très performants :
Les services Web XML prennent en charge la communication synchrone et asynchrone entre le client et le serveur qui héberge le service Web XML. Dans le cadre de la communication synchrone, le client envoie une demande de service au serveur hôte du service et attend la réponse. Ceci empêche le client d'effectuer d'autres opérations en attendant les résultats. La communication asynchrone, au contraire, conduit le client à continuer de traiter d'autres tâches tandis qu'il attend une réponse. Le client répond au résultat de la demande de service lorsqu'il est disponible.
Lorsque vous utilisez l'outil Web Services Description Language Tool (Wsdl.exe) pour créer votre classe proxy, il génère les versions synchrones et asynchrones standard de la méthode dans la classe. Les versions asynchrones consistent en deux méthodes appelées Begin et End. La méthode Begin est utilisée pour initier le service Web XML, tandis que la méthode End extrait les résultats.
L'utilisation de la communication asynchrone améliore l'usage du système et évite les temporisations sur le client tandis qu'il attend les résultats du service Web.
L'exemple de code suivant illustre comment faire un appel asynchrone à un service Web XML à partir d'une application cliente.
<%@ 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>
Pour plus d'informations sur la communication asynchrone, consultez Communication asynchrone avec les services Web XML.
Le fait de faire de nombreuses demandes de service sur Internet peut affecter la performance de l'application cliente. Lorsque vous concevez votre service Web XML, faites un usage efficace des demandes de service en créant des méthodes qui regroupent les informations associées. Supposons par exemple que vous ayez un service Web XML qui extrait des informations concernant un livre**.** Au lieu d'avoir des méthodes séparées pour extraire le titre, l'auteur et l'éditeur du livre, créez une méthode qui retourne toutes ces informations en une seule demande de service. Il est plus efficace de transférer un gros bloc d'information en une seule fois que plusieurs petits blocs d'information.
L'exemple de code suivant illustre comment regrouper des informations apparentées en une seule méthode de service 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
Lorsque vous concevez votre service Web XML, veillez à utiliser les méthodes standard de programmation orientée objet. Utilisez l'encapsulation pour masquer les détails d'implémentation. Pour des services Web XML plus complexes, vous pouvez utiliser l'héritage et le polymorphisme pour réutiliser du code et simplifier votre design.
L'exemple de code suivant illustre comment utiliser l'héritage pour créer un service Web XML qui effectue des calculs mathématiques.
<%@ 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
Utilisez la mise en cache de sortie pour améliorer la performance de votre service Web XML. Lorsque la mise en cache de sortie est activée, les résultats d'une demande de service sont stockés dans le cache de sortie pour une durée spécifiée. Si une demande de service Web XML similaire est faite, le résultat peut être obtenu à partir du cache au lieu d'être recalculé. Ceci améliore le temps de réaction du service Web XML en réduisant le traitement nécessaire à son serveur. La mise en cache peut être effectuée sur le client et le serveur. La propriété Duration vous permet de spécifier la durée nécessaire à la mise en cache de la sortie d'un service Web XML.
La directive permettant d'activer la mise en cache de sortie sur le client est :
<%@ OutputCache Duration="60" %>
L'exemple de code suivant illustre comment utiliser la propriété Duration sur l'application cliente pour spécifier la mise en cache de sortie pendant une période de 60 secondes.
<%@ 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>
Vous pouvez également utiliser la propriété CacheDuration de la classe d'attribut WebMethod pour activer la mise en cache sur le serveur. L'exemple de code suivant illustre comment utiliser la propriété CacheDuration sur les méthodes de service Web XML pour spécifier la mise en cache de sortie pendant une période de 60 secondes.
<%@ 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
Lorsque vous concevez votre service Web XML, essayez de respecter la structure selon laquelle un schéma est mis en forme.
Les services Web XML utilisent SOAP comme protocole primaire de transport et de sérialisation. Un message SOAP est constitué d'un ensemble optionnel d'en-têtes et du corps de message. La section en-tête contient les informations qui peuvent être traitées par l'infrastructure sur le serveur Web. SOAP ne définit aucun en-tête. La section corps contient les informations traitées par une application, telles que les paramètres ou la valeur de retour pour un service Web XML.
Pour plus d'informations sur l'utilisation des en-têtes SOAP, consultez Utilisation d'en-têtes SOAP.
Fournissez la documentation relative à votre service Web XML, un fichier HTML statique par exemple, décrivant le fonctionnement de votre service et les structures de données. Incluez aussi des exemples d'utilisation du service Web XML. Ne comptez pas uniquement sur la description de service ou la page d'aide comme seule documentation.
Voir aussi
Création de services Web XML à l'aide d'ASP.NET | Communication asynchrone avec les services Web XML | Utilisation d'en-têtes SOAP