Instrucciones de diseño de servicios Web XML creados mediante ASP.NET
Los servicios Web XML constituyen una tecnología eficaz para proporcionar servicios a los que se puede tener acceso mediante programación a través de Internet. A continuación se ofrecen algunas recomendaciones útiles para crear servicios Web XML avanzados:
Los servicios Web XML permiten la comunicación sincrónica y asincrónica entre el cliente y el servidor que aloja el servicio Web XML. En la comunicación sincrónica, el cliente envía una solicitud de servicio al servidor host del servicio y espera la respuesta. Esto impide que el cliente lleve a cabo otras operaciones mientras espera los resultados. Por su parte, la comunicación asincrónica permite que el cliente continúe el procesamiento de otras tareas mientras espera una respuesta. El cliente responde al resultado de la solicitud de servicio cuando está disponible.
Al utilizar la herramienta Lenguaje de descripción de servicios Web (Wsdl.exe) para crear la clase de proxy, se generan las versiones sincrónicas y versiones asincrónicas estándar de los métodos de la clase. Las versiones asincrónicas constan de dos métodos denominados Begin y End. El método Begin se utiliza para iniciar el servicio Web XML, mientras que el método End sirve para recuperar los resultados.
El uso de comunicación asincrónica mejora la utilización del sistema y evita retrasos en el cliente mientras espera los resultados del servicio Web XML.
En el ejemplo de código siguiente se demuestra cómo realizar una llamada asincrónica a un servicio Web XML desde una aplicación 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>
Para obtener más información acerca de la comunicación asincrónica, vea Comunicar con servicios Web XML de forma asincrónica.
La realización de multitud de solicitudes de servicio a través de Internet puede afectar al rendimiento de la aplicación cliente. Al diseñar el servicio Web XML, haga un uso eficaz de las solicitudes de servicio mediante la creación de métodos que agrupen información relacionada. Por ejemplo, suponga que tiene un servicio Web XML que recupera información acerca de un libro. En lugar de tener métodos independientes para recuperar el título del libro, el autor y la editorial, cree un método que devuelva toda la información en una sola solicitud de servicio. Es más eficaz transferir un bloque grande de datos a la vez que varios bloques pequeños.
En el ejemplo de código siguiente se muestra cómo agrupar información relacionada en un único método de servicio 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
Al diseñar el servicio Web XML, asegúrese de utilizar prácticas estándar de programación orientada a objetos. Utilice la encapsulación para ocultar los detalles de la implementación. Al diseñar servicios Web XML más complejos, puede utilizar herencia y el polimorfismo para reutilizar el código y simplificar el diseño.
En el ejemplo de código siguiente se demuestra cómo utilizar la herencia para crear un servicio Web XML que realice cálculos matemáticos.
<%@ 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
Utilice el almacenamiento en caché de los resultados para mejorar el rendimiento del servicio Web XML. Si el almacenamiento en caché de los resultados está activado, los resultados de una solicitud de servicio se almacenan en la caché durante un tiempo determinado. Si se realiza una solicitud similar de servicio Web XML, el resultado se puede obtener de la caché, en lugar de repetir el procesamiento. Con esto se mejora el tiempo de reacción del servicio Web XML al reducir el procesamiento requerido en su servidor. El almacenamiento en caché se puede llevar a cabo en el cliente y en el servidor. La propiedad Duration permite especificar la cantidad de tiempo que se debe almacenar en caché el resultado de un servicio Web XML.
La directiva para habilitar el almacenamiento en caché del resultado en el cliente es la siguiente:
<%@ OutputCache Duration="60" %>
En el ejemplo de código siguiente se demuestra cómo utilizar la propiedad Duration en la aplicación cliente para especificar el almacenamiento en caché del resultado durante un período de 60 segundos.
<%@ 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>
También puede utilizar la propiedad CacheDuration de la clase de atributo WebMethod para habilitar el almacenamiento en caché en el servidor. En el ejemplo de código siguiente se demuestra cómo utilizar la propiedad CacheDuration en métodos de servicio Web XML para especificar el almacenamiento en caché del resultado durante un período de 60 segundos.
<%@ 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
Al diseñar el servicio Web XML, intente seguir la estructura de formato de un esquema.
Los servicios Web XML utilizan SOAP como protocolo principal de transporte y serialización. Un mensaje SOAP consta de un conjunto opcional de encabezados y del cuerpo del mensaje. La sección de encabezado contiene información que se puede procesar en la infraestructura del servidor Web. SOAP no define ningún encabezado. La sección del cuerpo contiene información procesada por una aplicación, como los parámetros o el valor devuelto de un servicio Web XML.
Para obtener más información sobre cómo utilizar los encabezados SOAP, vea Utilizar encabezados SOAP.
Proporcione documentación para el servicio Web XML, como un archivo HTML estático, que describa el funcionamiento del servicio y las estructuras de datos. Incluya igualmente ejemplos de cómo utilizar el servicio Web XML. No se base en la descripción de servicio o la página de ayuda del servicio como única documentación.
Vea también
Generar servicios Web XML mediante ASP. NET | Comunicar con servicios Web XML de forma asincrónica | Utilizar encabezados SOAP