Mensaje dentro de Tutoriales ASP.NET

Web Services

 
#1 - 11/04/2006 13:06:11 Reporta abuso | Link Permanente
Jau
Fecha de registro: 03/12/2006
0 post en este tema
164 posts en tutoriales asp.net
6 posts en todos los foros
Web Services

Traducción del tutorial sobre Web Services de la web oficial de ASP.NET.

Cómo en casi todas nuestras traducciones, lo mostraremos en C#. Si necesitaráis ver el código en cualquier otro lenguaje, tendréis que acudir a la página de los tutoriales sobre webservices que encontrareis en asp.net.

Muchas gracias a Jau y Subgurim.
Volver arriba

Respuestas
Mostrar de en 15
#2 - 11/04/2006 13:30:45 Reporta abuso | Link Permanente
Jau
Fecha de registro: 03/12/2006
1 post en este tema
164 posts en tutoriales asp.net
6 posts en todos los foros
Utilizar las Credenciales Por Defecto

Sencillo Web Service Que Demuestra el Uso de la Característica UseDefaultCredentials

Cuando la propiedad UseDefaultCredentials en una instancia de una clase de un cliente proxy se establece a verdadero, el cliente usará las credenciales por defecto para autenticarse frente al Web Service. Por ejemplo:

UseDefaultCredentialsService service = new UseDefaultCredentialsService();
service.UseDefaultCredentials = true;
Estableciendo la propiedad UseDefaultCredentials a verdadero equivale a las siguientes líneas de código:
service.Credentials = System.Net.CredentialCache.DefaultCredentials;
NOTA: El Web Service de este ejemplo debe configurarse para soportar autenticación de Windows integrada para demostrar correctamente la forma de pasar las credenciales por defecto.

Ejecutar Ejemplo C#



Volver arriba

#3 - 11/04/2006 13:28:56 Reporta abuso | Link Permanente
Jau
Fecha de registro: 03/12/2006
1 post en este tema
164 posts en tutoriales asp.net
6 posts en todos los foros
Comparticion de Tipos Entre Servicios

Compartición del Tipo Proxy

Los Servicios Web de ASP.NET soportan la compartición del tipo proxy. Ésto nos permite compartir tipos idénticos desde diferentes Servicios Web en el proxy de la classe del lado del cliente. Por ejemplo, pordemos coger una instancia devuelta por un Servicio Web y pasársela a otro, y viceversa.

En este ejemplo, una factura de un producto se devuelve desde el Centro de Pedidos. Luego, el usuario quiere actualizar la fecha de envío en el pedido. Para hacerlo, el usuario pasa la misma instancia ProductInvoce al Centro de Envíos, que actualiza el pedido y devuelve la factura modificada.

¿Cómo identificamos tipos idénticos? Los tipos idénticos tienen el mismo nombre y espacio de nombres, y también comparten el la misma definición de tipo de esquema.

En este ejemplo indicamos que los tipos tienen que ser compartidos,  poniendo el wsdl y el discomap de cada servicio en el directorio  'App_WebReferences'. Si en lugar de eso queremos usar el wsdl.exe para crear el proxy cliente, aquí está el comando para compartir tipos entre TypeSharingService1 y TypeSharingService2:

<!-- To share types, use the /sharetypes flag with wsdl.exe.  For example (all in one line): -->

wsdl.exe /sharetypes
http://localhost/QuickstartV20/webservices/Samples/TypeSharing/cs/Server/TypeSharingService1.asmx
http://localhost/QuickstartV20/webservices/Samples/TypeSharing/cs/Server/TypeSharingService2.asmx
Ejecutar Ejemplo C#




Volver arriba

#4 - 11/04/2006 13:27:36 Reporta abuso | Link Permanente
Jau
Fecha de registro: 03/12/2006
1 post en este tema
164 posts en tutoriales asp.net
6 posts en todos los foros
Utilizar Cabeceras SOAP

Cabeceras SOAP

Este ejemplo muestra el uso del soporte de los Servicios Web de ASP.NET para cabeceras SOAP. El ejemplo emplea una cabecera de autorización enviada con la petición, con información sobre nombre de usuario y contraseña. La primera llamada a WebMethod no inlcuye la cabecera SOAP y por eso falla. La segunda llamada a WebMethod incluye la cabecera SOAP y vuelve satisfactoriamente.

CUIDADO: Este ejemplo sólo tiene fines demostrativos. El nombre de usuario y la contraseña se envñian en texto llamo, lo cual nunca debe hacerse en una aplicación real. No es seguro sin modificación.

// On the server, create the AuthHeader class which extends from SoapHeader
public class AuthHeader : SoapHeader {
public string Username;
public string Password;
}

// On the client, create a new instance of the AuthHeader class
AuthHeader myHeader = new AuthHeader();

//WARNING: This sample is for demonstration purposes only. Username/password information is sent in plain text,
//which should never be done in a real application. It is not secure without modification.
myHeader.Username = "JaneDoe";
myHeader.Password = "password";

// Set the AuthHeader public member of the Web service instance to myHeader
service.AuthHeaderValue = myHeader;

// Call the Web service, which automatically sends the header with the request
string answer = service.HelloWorld();
Ejecutar Ejemplo C#



Volver arriba

#5 - 11/04/2006 13:26:24 Reporta abuso | Link Permanente
Jau
Fecha de registro: 03/12/2006
1 post en este tema
164 posts en tutoriales asp.net
6 posts en todos los foros
Utilizar Excepciones SOAP

Web Service ASP.NET Web Service Que Lanza una Excepción Soap con Información Personalizada

El servidor puede enviar información personalizada del fallo al cliente mediante SoapException. Cuando se lanza una SoapException (y no se captura) el servidor envía la información del error en forma de error SOAP. El fallo SOAP se "deserializa" en una excepción en el cliente. Información personalizada (entendible por la máquina) del error se envía en el elemento "Detail" del error SOAP. Un error SOAP también incluye un mensaje de error legible por personas, un código de error y, opcionalmente, un actor SOAP.


//assume that there was an error validating the SOAP Message
if(true)
{
XmlDocument doc = new XmlDocument();
//insert your own XML into the XmlDocument,
//this will go into the Detail element of the SOAP fault
string errorMsg = "An error was received...";
//the SOAP fault will contain a human-readable error message,
//the fault code, the SOAP actor, and the detail element
SoapException exc = new SoapException(errorMsg, SoapException.ClientFaultCode, "", detail);
throw exc;
}
Ejecutar Ejemplo C#


Volver arriba

#6 - 11/04/2006 13:24:51 Reporta abuso | Link Permanente
Jau
Fecha de registro: 03/12/2006
1 post en este tema
164 posts en tutoriales asp.net
6 posts en todos los foros
Usar Interfaz de Servidor

Sencillo Web Service Que Muestra la Característica de Inerfaz de Servidor


Para usar la característica ServerInterface feature, tenemos dos opciones:
  • (1) Ejecutar wsdl.exe usando el switch(conmutador) /serverInterface (o /si, abreviando) con un fichero wsdl. La salida será un fichero de código que contendrá la interfaz para cada vinculación wsdl.
  • (2) Escribir la(s) interface(s) nosotros mismos y aplicarle(s) [WebServiceBindingAttribute] y [WebMethodAttribute] en cada método Web de la(s) interface(s).
Aquí tenemos un ejemplo de cómo usar la opción (1) desde la línea de comandos:
wsdl.exe /si ServerInterfaceSample.wsdl

El Servicio Web del siguiente ejemplo se escribió usando la opción (2). La interfaz es así:
[WebServiceBinding(Name="ReportDateTime", Namespace="Microsoft.Samples.XmlMessaging.WebServices")]
public interface IReportDateTime
{
[WebMethod]
DateTime getCurrentDateTime();
}
La implementación es así:
[WebService(Namespace="Microsoft.Samples.XmlMessaging.WebServices")]
public class ServerInterfaceService : IReportDateTime
{
public DateTime getCurrentDateTime()
{
//Web method implementation here
}
}
Independientemente de la opción que elijamos, tendremos que implementar la(s)interface(s) en nuestro código del servicio. La ventaja de esto es que el código de implementación se mantiene separado del de contrato (como definimos en la interfaz). Si cambiamos el wsdl y luego regeneramos la interfaz, no perderemos nada del código de implementación. Para seguir las indicaciones de diseño recomendadas, no debemos poner código en la implementación que cambie el contrato wsdl. De igual forma, no debemos alterar las interfaces con código que afecte el comportamiento en tiempo de ejecución. Los detalles del contrato y la implementación deben permanecer separados.

NOTA: Esta característica deja obsoleto el uso de /server con wsdl.exe.

Ejemplo en C#



Volver arriba

#7 - 11/04/2006 13:22:58 Reporta abuso | Link Permanente
Jau
Fecha de registro: 03/12/2006
1 post en este tema
164 posts en tutoriales asp.net
6 posts en todos los foros
Seleccionar el Servicio en Tiempo de Ejecución

Cliente ASP.NET Web Service Que Permite la Selección en Tiempo de Ejecución del Web Service

En lugar de "hardcoding" la ubicación de nuestro Web Service o utilizar la ubicación por defecto en el proxy cliente, podemos almacenar el valor en config. Esto nos permitirá a nosotros o al administrador cambiar la ubicación en config, sin tener que cambiar el código.

<configuration>
<appSettings>
<add key="WSUrl" value="insert location here..." />
</appSettings>
</configuration>
Ejecutar Ejemplo C#



Volver arriba

#8 - 11/04/2006 13:21:48 Reporta abuso | Link Permanente
Jau
Fecha de registro: 03/12/2006
1 post en este tema
164 posts en tutoriales asp.net
6 posts en todos los foros
Llamadas al Método "RAD Async"

Los Web Services de ASP.NET soportan un nuevo modelo para llamadas a WebMethods asíncronos. Utilizaremos el modelo basado en eventos para llamar de forma asíncrona a nuestros Servicios Web. Esto nos muestra cómo definir nuestra función de "callback" y añadirla a nuestro manejador de eventos de la clase proxy. Cuándo vuelve la llamada al método, se llama a la función "callback".

//First implement the HelloWorldCompleted method using the following signature:
//public void HelloWorldCompleted(object sender, HelloWorldCompletedEventArgs args)

//Create the Web service
HelloWorldWaitService service = new HelloWorldWaitService();
//Add our callback function to the event handler
service.HelloWorldCompleted += this.HelloWorldCompleted;
//Call the Web service asynchronously
service.HelloWorldAsync("first call");
//when the Web service call returns the HelloWorldCompleted method will be called
C# Sample Caption


Volver arriba

#9 - 11/04/2006 13:20:19 Reporta abuso | Link Permanente
Jau
Fecha de registro: 03/12/2006
1 post en este tema
164 posts en tutoriales asp.net
6 posts en todos los foros
Validación de Mensajes

Servicio Web Que Valida Mensajes Entrantes de Acuerdo con un Esquema

Para validar los mensajes en el servicio usamos XmlValidatingReader. El mejor lugar para hacerlo es en una extensión SOAP. Ésto nos da un control completo sobre los contenidos del mensaje SOAP y nos permite descartar mensajes que no cumplen con el esquema antes del paso de deserialización, relativamente costoso.

Observar que este ejemplo valida los mensajes en el cuerpo del WebMethod. Esto se ha hecho por simplicidad. Los pasos para validar un mensaje son los mismos independientemente del lugar. Para más información sobre la validación en extensiones SOAP, acudid a MSDN article.

//create the validating reader
XmlTextReader tr = new XmlTextReader(input, XmlNodeType.Document, null);
XmlValidatingReader vr = new XmlValidatingReader(tr);

//add the schema and set the validation type to schema
XmlSchemaCollection schemas = new XmlSchemaCollection();
schemas.Add("Microsoft.Samples.Web.Services", "insert location here...");
vr.Schemas.Add(schemas);
vr.ValidationType = ValidationType.Schema;

//add our event callback function to the event handler in case there is a validation error
vr.ValidationEventHandler += new ValidationEventHandler (ValidationHandler);

try
{
//if there is an error we will fall out of this while loop and our callback function will be called
while (vr.Read())
{
//do nothing
}
}
catch (Exception exception)
{
//an exception will be thrown if there are non-validation errors, e.g. in the case of malformed XML
}
Ejecutar el ejemplo C#



Volver arriba

#10 - 11/04/2006 13:18:36 Reporta abuso | Link Permanente
Jau
Fecha de registro: 03/12/2006
1 post en este tema
164 posts en tutoriales asp.net
6 posts en todos los foros
Crear un Sencillo Servicio Matemático

Sencillo Web Service Que Realiza Aritmética Básica



Este Web Service tiene cuatro WebMethods que realizan las siguientes operaciones:
  • Suma
  • Resta
  • Multiplicación
  • División

Ejecutar C# Sample


Volver arriba

#11 - 11/04/2006 13:17:30 Reporta abuso | Link Permanente
Jau
Fecha de registro: 03/12/2006
1 post en este tema
164 posts en tutoriales asp.net
6 posts en todos los foros
Utilizando Sesiones ASP.NET

Intrinsecos (Administración de Sesiones ASP.NET y Estado de la Aplicación)

Los Servicios Web de ASP.NET nos permiten acceder a la administración de estado subyacente que proporciona ASP.NET. Para permitir el estado de sesión de ASP.NET tenemos que establecer set WebMethod.EnableSession = True. En el cliente tendremos que fijar serviceName.CookieContainer a una nueva instancia de System.Net.CookieContainer. Esto nos permite mantener los datos en la misma sesión. Observar que para mantener los datos para toda la aplicación (para todas las peticiones entrantes al servicio), no se requiere ningún paso.

Código del Lado del Cliente
//On the client you must add the following code (for session state only):
serviceName.CookieContainer = new System.Net.CookieContainer();
Código del Lado del Servidor
//Setting EnableSession to true allows state to be persisted per Session
[WebMethod(EnableSession=true)]
public String UpdateSessionHitCounter() {
//update the session "HitCounter" here
return Session["HitCounter"].ToString();
}

//Note that state can be persisted for the entire Application even if EnableSession is false
[WebMethod(EnableSession=false)]
public String UpdateApplicationHitCounter() {
//update the application "HitCounter" here
return Application["HitCounter"].ToString();
}
C# Sample Caption

  

Volver arriba

#12 - 11/04/2006 13:15:09 Reporta abuso | Link Permanente
Jau
Fecha de registro: 03/12/2006
1 post en este tema
164 posts en tutoriales asp.net
6 posts en todos los foros
Permitir la DesCompresión de Servicios Web

Sencillo Servicio Web que Muestra la Función EnableDecompression


Cuando la propiedad EnableDecompression de una instancia de un cliente de una clase proxy se establece a verdadero, el cliente soportará la descompresión.
EnableDecompressionService service = new EnableDecompressionService();
service.EnableDecompression = true;
Esto nos da la habilidad de interoperar con servicios que soporten la compresión.

Para deshabilitar la descompresión, tendremos que establecer EnableDecompression a falso. Un probable escenario dónde pasa esto es cuando queremos ver las trazas SOAP de las respuestas enviadas desde el servidor, en texto plano. Estableciendo la propiedad a falso, permitimos que el servidor sepa que la descompresión no se soporta.

NOTA: El Servicio Web de este ejemplo no soporta compresión.

Run C# Sample


Volver arriba

#13 - 11/04/2006 13:13:34 Reporta abuso | Link Permanente
Jau
Fecha de registro: 03/12/2006
1 post en este tema
164 posts en tutoriales asp.net
6 posts en todos los foros
Devolver Varios Tipos de Datos

ASP.NET Web Services nos da una gran flexibilidad para estructurar los mensajes que se pasan hacía y desde un Servicio Web. Este ejemplo muestra ejemplos de WebMethods que devuelven los siguientes tipos de datos:
  • Primitive (String)
  • Array of Primitives (Integers)
  • Enumeration (Enum)
  • Class/Struct
  • Array of Classes/Structs
C# Sample Caption

Volver arriba

#14 - 11/04/2006 13:12:22 Reporta abuso | Link Permanente
Jau
Fecha de registro: 03/12/2006
1 post en este tema
164 posts en tutoriales asp.net
6 posts en todos los foros
Utilizar el Protocolo SOAP 1.2

Elegir Protocolo


ASP.NET Web Services soporta tanto SOAP 1.1 como SOAP 1.2. Por defecto, cada protocolo tendrá un vínculo en el wsdl producido para el servicio. Para funcionar, o dejar de hacerlo, en SOAP 1.1 o SOAP 1.2, tendremos que modificar las opciones de configuración tanto en el machine.config como en el web.config. Descomentando las líneas del siguiente ejemplo deshabilitaremos el soporte para SOAP 1.1 o SOAP 1.2 respectivamente.
<system.web>
<webServices>
<protocols>
<!-- <remove name="HttpSoap"/> -->
<!-- <remove name="HttpSoap1.2"/> -->
</protocols>
</webServices>
</system.web>
C# Sample Caption


Volver arriba

#15 - 11/04/2006 13:11:09 Reporta abuso | Link Permanente
Jau
Fecha de registro: 03/12/2006
1 post en este tema
164 posts en tutoriales asp.net
6 posts en todos los foros
Creación de un servicio BP-Conformant

Conformidad con "WS-I Basic Profile 1.1"


Ahora, los Web Services de ASP.NET soportan el WS-I Basic Profile.

Para crear un Web Service que cumpla el WS-I Basic Profile, tenemos que usar el atributo WebServiceBinding en nuestra classe Web service. Estableciendo el valor deWebServiceBinding.ConformanceClaims a WsiProfiles.BasicProfile1_1 conseguimos que el puerto SOAP 1.1 que tendremos cumpla el WS-I Basic Profile 1.1. (Observar que las vinculaciones de SOAP 1.2 no cumplen con el Basic Profile 1.1 por definición). Estableciendo WebServiceBinding.EmitConformanceClaims = true se emitirán elementos documentales en el WSLD del servicio que indicarán su conformidad con WS-I Basic Profile 1.1. Estas indicaciones no son necesarias, por lo que podemos hacer que no aparezcan (manteniendo la conformidad del puerto) estableciendoEmitConformanceClaims = false.

NOTA: Por defecto los nuevos Web Services creados por Visual Studio son BP-conformant y tienen la propiedad WebServiceBinding.EmitConformanceClaims fijada a true..
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1, EmitConformanceClaims=true)]
[WebService(Namespace="Microsoft.Samples.XmlMessaging.WebServices")]
public class BPConformance_asmx
{
[WebMethod]
public string HelloWorldBP()
{
//implement method here
}
}
C# Sample Caption



Volver arriba
Mostrar de en 15

Hospedado en domitienda