XML,%20Distribuci - PowerPoint PPT Presentation

About This Presentation
Title:

XML,%20Distribuci

Description:

XML, Distribuci n y Componentes Tema 3 Aplicaciones Distribuidas: Servicios Web http://paginaspersonales.deusto.es/dipina/MasterISW/ Dr. Diego Lz. de Ipi a Gz ... – PowerPoint PPT presentation

Number of Views:134
Avg rating:3.0/5.0
Slides: 79
Provided by: deu96
Category:

less

Transcript and Presenter's Notes

Title: XML,%20Distribuci


1
XML, Distribución y ComponentesTema 3
Aplicaciones Distribuidas Servicios Web
http//paginaspersonales.deusto.es/dipina/MasterIS
W/
  • Dr. Diego Lz. de Ipiña Gz. de Artaza
  • http//paginaspersonales.deusto.es/dipina
    (Personal)
  • http//www.morelab.deusto.es (Research Group)
  • http//www.smartlab.deusto.es (Research Lab)
  • http//www.ctme.deusto.es (Cátedra de Telefónica
    Móviles)
  • http//www.tecnologico.deusto.es
    (Tecnológico-Fundación Deusto)

2
Temario
  • Procesamiento XML en .NET (21 y 22 Febrero)
  • Estándar .NET XML.NET
  • Soporte XML XML-SAX, XML-DOM, Validación
  • XSL XPath, XSLT, Scripts, Objetos de extensión
  • Aplicaciones distribuidas (23 Febrero, 5 Marzo)
  • XML/SOAP
  • .NET Remoting
  • Mensajería
  • Componentes .NET (6 y 7 Marzo)
  • Metadatos y Reflexion
  • Componentes .NET y Enterprise Services
  • Complementos
  • Interoperabilidad COM y P/Invoke
  • COM y MTS
  • MSMQ (colas de mensajes)
  • Microsoft Communication Foundation (Indigo)

3
Contenidos Parte Aplicaciones Distribuidas
  • WebServices y SOAP
  • .NET Remoting
  • Mensajería

4
Introducción I
  • Los Servicios Web son la piedra angular de la
    iniciativa .NET
  • Los ordenadores hablan unos a otros a través de
    la web usando HTTP y otros protocolos.
  • Un servicio web no tiene interfaz gráfica
  • Provee una API de métodos que pueden ser
    invocados en la web
  • Diseñados para proveer servicios
  • .NET hace muy sencillo poder crear servicios web

5
Introducción II
  • Futuro en el que los negocios exponen
    aplicaciones a clientes como Servicios Web en los
    cuales se paga por su uso
  • Los sistemas de diferentes empresas cooperan unos
    con otros a través de la Web
  • Mientras que DCOM está basado en estándares
    propietarios, los Servicios Web lo están en XML y
    HTTP
  • Son independientes de la plataforma y del
    lenguaje como CORBA, pero más aceptados
  • En .NET, IIS y la infraestructura ASP.NET
    compilan las fuentes, construyen contratos WSDL y
    manejan las peticiones y respuestas de los
    servicios web.

6
SOA
  • Los servicios web han dado lugar a un nuevo modo
    de diseñar sistemas distribuídos
  • Arquitecturas SOA (Service Oriented Arquitecture)
  • SOA colección de servicios
  • Más información en http//www.service-architecture
    .com/
  • http//msdn.microsoft.com/Longhorn/understanding/p
    illars/Indigo/default.aspx?pull/library/en-us/dnb
    da/html/srorientwp.asp

7
SOA Find-By-Execute Paradigm
8
Servicios Web
  • Son un estándar basado en protocolos abiertos
    como HTTP y SOAP
  • SOAP es un vocabulario XML que representa RPCs
  • http//www.w3.org/TR/SOAP
  • No necesitas ni Windows ni .NET para escribir
    servicios web
  • Servicio web aplicación que
  • se ejecuta en un servidor web
  • expone métodos a clientes
  • escucha peticiones HTTP representando comandos
    que invocan a métodos Web
  • ejecuta métodos web y devuelve resultados

9
Servicio Web Hola Mundo I
  • Creamos el directorio virtual ws
  • Hacemos doble click en Herramientas
    Administrativas
  • Doble click en Internet Information Services

10
Servicio Web Hola Mundo II
  • Creamos el directorio virtual ws
  • Hacemos clic con el botón derecho del ratón en
    Default Web Site y luego seleccionamos
    New?Virtual Directory
  • Seleccionamos el directorio donde vamos a dejar
    los fichero accesibles por el contexto ws

11
Servicio Web Hola Mundo III
  • lt_at_ WebService Language"C" Class"HelloService1"
    gt
  • // file helloservice1.asmx
  • // description hello web service - basic
    version
  • using System.Web.Services
  • WebService(
  • Description"A greeting Web service",
  • Namespace"http//tempuri.org/ws"
  • )
  • public class HelloService1 WebService
  • WebMethod(Description"Greet by name.")
  • public string Greet(string name)
  • if (name "") name "Stranger"
  • return "Hello, " name "!"

12
Servicio Web Hola Mundo IV
  • La primera línea indica que el fichero
    helloservice1.asmx es un servicio web programado
    en C, contenido en una clase llamada
    HelloService1
  • El atributo WebService te permite añadir
  • Una descripción para el servicio web
    (description)
  • El espacio de nombres evita colisiones con otros
    servicios web creados por otras personas y con el
    mismo nombre (Namespace)
  • Para definir un método web es necesario etiquetar
    un método público con el atributo WebMethod
  • El parámetro Description describe el método
  • HelloService1 es derivado de System.Web.Services.W
    ebService
  • Esto le da acceso a la propiedad Context de
    ASP.NET y hace disponible al servicio web los
    objetos Request, Response y Session.

13
Servicio Web Hola Mundo V
  • Para instalar el servicio cópialo al directorio
    Inetpub\wwwroot\ws
  • Lanza tu navegador e introduce la url
    http//localhost/ws/helloservice1.asmx
  • La página visualizada es generada por
    DefaultWsdlHelpGenerator.aspx
  • Si quieres que la apariencia de tus servicios web
    varíe modifica
  • C\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFI
    G\DefaultWsdlHelpGenerator.aspx
  • Y la entrada helpgenerator en C\WINDOWS\Microsoft
    .NET\Framework\ltversiongt\CONFIG\machine.config

14
Servicio Web Hola Mundo VI
  • Propiedades de los servicios web en .NET
  • Los servicios web se implementan en ficheros asmx
  • Todo servicio web comienza con la directiva
    _at_WebService
  • Debe contener al menos el atributo Class
    identificando a la clase que representa al
    servicio
  • Otros atributos opcionales que se pueden utilizar
    son name y description, que aparecerán en la
    página web producida al invocar calc.asmx
  • HTTP, XML y SOAP están escondidos
  • Se pueden invocar usando HTTP GET y POST, aparte
    de SOAP

15
Servicio Web Hola Mundo VII
  • Un mensaje SOAP es como un sobre moviéndose de un
    lugar a otro
  • HelloService1 define un método Greet que cuando
    es llamado devuelve un resultado
  • Tanto la petición como la respuesta son mensajes
    SOAP
  • El WSDL generado soporta tres protocolos
  • HttpGet ? usa HTTP GET para invocar el servicio
  • HttpPost ? usa HTTP POST
  • SOAP
  • Sólo SOAP puede representar tipos de datos
    complejos y lo usaremos de ahora en adelante.

16
Servicio Web Hola Mundo VIII
17
Servicio Web Suma y Resta I
  • lt_at_ WebService Language"C" Class"CalcService"
    gt
  • using System
  • using System.Web.Services
  • WebService (NameServicio Web Calculadora",
  • DescriptionEjecuta sumas y restas simples
    sobre la web")
  • class CalcService
  • WebMethod (DescriptionCalcula la suma de
    dos enteros")
  • public int Add (int a, int b)
  • return a b
  • WebMethod
  • (DescriptionCalcula la diferencia de
    dos enteros")
  • public int Subtract (int a, int b)
  • return a - b

18
Servicio Web Suma y Resta II
  • Para desplegar la aplicación copia calc.asmx a
    C\Inetpub\wwwroot\ws
  • La invocación de http//localhost/ws/calc.asmx,
    para sumar 2 y 2, produce
  • POST /calc.asmx HTTP/1.1
  • Host localhost
  • Content-Type text/xml charsetutf-8
  • Content-Length 338
  • SOAPAction http//tempuri.org/Add
  • lt?xml version1.0 encodingutf-8?gt
  • ltsoapEnvelope xmlnsxsihttp//www.w3.org/2001/XM
    LSchema-instance xmlnsxsdhttp//www.w3.org/2001/
    XMLSchema xmlnssoaphttp//schemas.xmlsoap.org/so
    ap/envelope/gt
  • ltsoapBodygt
  • ltAdd xmlnshttp//tempuri.org/gt
  • ltagt2lt/agt
  • ltbgt2lt/bgt
  • lt/Addgt
  • lt/soapBodygt
  • ltsoapEnvelopegt

19
Servicio Web Suma y Resta III
  • La respuesta del servicio web es
  • HTTP/1.1 200 OK
  • Content-Type text/xml charsetutf-8
  • Content-Length 353
  • lt?xml version1.0 encodingutf-8?gt
  • ltsoapEnvelope xmlnsxsihttp//www.w3.org/2001/XM
    LSchema-instance xmlnsxsdhttp//www.w3.org/2001/
    XMLSchema xmlnssoaphttp//schemas.xmlsoap.org/so
    ap/envelope/gt
  • ltsoapBodygt
  • ltAddResponse xmlnshttp//tempuri.org/gt
  • ltAddResultgt4lt/AddResultgt
  • lt/AddResponsegt
  • lt/soapBodygt
  • ltsoapEnvelopegt

20
Implementación de servicios web
  • La parte más complicada para escribir servicios
    web es procesar las peticiones XML que llegan vía
    HTTP y generar las respuestas HTTP
  • .NET refugia al programador de los detalles de
    bajo nivel de HTTP, SOAP y XML

21
Creando Servicios webs calc.asmx III
22
Creando Servicios webs calc.asmx IV
  • Si invocamos el formulario que aparece al ir a
    http//localhost/ws/calc.asmx, haciendo clic en
    el enlace Add, generado por ASP.NET obtenemos

23
Creando Servicios webs calc.asmx V
  • Los formularios que genera ASP.NET de los
    ficheros ASMX permiten probar los servicios web
    que escribes, sin desarrollar un cliente web.

24
Code-Behind I
  • Sirve para mover las clases de un ASMX a una DLL
    separada.
  • El ASMX (wwwroot\wscodebehingwebservice.asmx)
    contendría sólo una sentencia
  • lt_at_ WebService ClassCalcService gt
  • Para compilar la clase utilizaríamos
  • csc /tlibrary calc.cs
  • Moveríamos el DLL a wwwroot\ws\bin

25
Code-Behind II
  • // fichero calc.cs
  • using System
  • using System.Web.Services
  • WebService (NameServicio Web Calculadora",
  • DescriptionEjecuta sumas y restas simples
    sobre la web")
  • class CalcService
  • WebMethod (DescriptionCalcula la suma de
    dos enteros")
  • public int Add (int a, int b)
  • return a b
  • WebMethod
  • (DescriptionCalcula la diferencia de
    dos enteros")
  • public int Subtract (int a, int b)
  • return a - b

26
La clase base WebService
  • Opcionalmente hacemos que los servicios web
    deriven de System.Web.Services.WebService
  • Provee objetos como Application, Session,
    Context, Server y User a la clase derivada,
    permitiendo al servicio web acceder a los objetos
    ASP.NET
  • class CalcService WebService

27
El atributo WebMethod
  • Etiqueta a un método como método Web
  • Soporta los siguientes parámetros
  • BufferResponse ? permite bufear repuestas
  • CacheDuration ? cachea respuestas generadas por
    este método
  • Description ? añade una descripción textual a un
    método
  • EnableSession ? permitir añadir estado de sesión
    a un método
  • MessageName ? le da un nombre al método
  • TransactionOption ? especifica el comportamiento
    de transacción del método web

28
Ejemplos parámetros WebMethod I
  • Cachea la salida por 10 segundos
  • WebMethod (CacheDuration10)
  • public string GetCurrentTime ()
  • return DateTime.Now.ToShortTimeString()
  • Guarda estado a través de las invocaciones en una
    sesión
  • class CalcService WebService
  • WebMethod (EnableSessiontrue,
  • DescriptionAñade un elemento a la cesta
  • public void AddToCart(Item item)
  • ShoppingCart cart (ShoppingCart)SessionMyS
    hoppingCart
  • cart.Add(item)

29
Ejemplos parámetros WebMethod II
  • No se pueden sobreescribir métodos en servicios
    web
  • Solución usar el parámetro MessageName, que da
    un nombre al método diferente al método que
    implementa
  • WebMethod (MessageNameAddInts)
  • public int Add (int a, int b)
  • return ab
  • Los métodos web podrían ahora llamarse AddInts y
    AddFloats

30
Web Services Description Language (WSDL) I
  • Para exportar la interfaz y metadatos ofrecidos
    por un servicio web (su CONTRATO) usamos WSDL.
  • Métodos web exportados
  • Protocolos soportados
  • Las firmas de los métodos
  • Localización del servicio (URL)
  • WSDL es un vocabulario XML estándar documentado
    en http//www.w3.org/TR/wsdl.
  • Estas descripciones pueden guardarse en un
    repositorio UDDI
  • No entraremos en detalles ya que WSDL es para
    máquinas, no humanos, y .NET genera los ficheros
    WSDL de un servicio web muy sencillamente
  • http//localhost/calc.asmx?wsdl

31
Web Services Description Language (WSDL) II
32
Web Services Description Language (WSDL) III
  • Si miramos al fichero WSDL encontraremos
  • Elemento service que describe el servicio web
  • Elementos operation que documentan las
    operaciones
  • Elementos binding que documentan los protocolos
    soportados por el servicio web
  • Etc.
  • Para publicar un servicio web deberemos publicar
    su contrato, WSDL.
  • Otros desarrolladores pueden utilizar el contrato
    para desarrollar clientes web
  • Nomalmente procesan el fichero WSDL a través de
    una herramienta que genera clases wrapper
  • En .NET se llama wsdl.exe

33
Tipos de datos complejos en Servicios Web
  • Cómo se pasan estructuras de datos e instancias
    de objetos en servicios web?
  • Son soportados porque cualquier tipo de dato
    puede representarse en XML
  • El siguiente fragmento de código ilustra la
    utilización del tipo de dato complejo Bookstore
  • El WSDL del servicio web proveerá el schema de
    este tipo de dato.
  • Dos dificultades en la utilización de servicios
    web con tipos complejos
  • No se pueden invocar estos servicios web usando
    HTTP GET y POST ? todavía podemos usar SOAP
  • Todos los campos o propiedades de una clase a
    serializar deben ser públicas

34
Locator.asmx I
  • lt_at_ WebService Language"C" Class"LocatorService
    " gt
  • using System
  • using System.Web.Services
  • using System.Data
  • using System.Data.SqlClient
  • WebService (Name"Bookstore Locator Service",
  • Description"Retrieves bookstore information
    from the Pubs database")
  • class LocatorService
  • WebMethod (Description"Finds bookstores in
    a specified state")
  • public Bookstore FindStores (string state)
  • return FindByState (state)

35
Locator.asmx II
  • Bookstore FindByState (string state)
  • SqlDataAdapter adapter new
    SqlDataAdapter
  • ("select from stores where state
    \'" state "\'",
  • "serverDIPINAdatabasepubsuidsapw
    dingeborg")
  • DataSet ds new DataSet ()
  • adapter.Fill (ds)
  • DataTable table ds.Tables0
  • Bookstore stores new
    Bookstoretable.Rows.Count
  • for (int i0 ilttable.Rows.Count i)
  • storesi new Bookstore (
  • table.Rowsi"stor_name".ToStrin
    g ().TrimEnd
  • (new char ' ' ),
  • table.Rowsi"stor_address".ToSt
    ring ().TrimEnd
  • (new char ' ' ),
  • table.Rowsi"city".ToString
    ().TrimEnd
  • (new char ' ' ),

36
Locator.asmx III
  • public class Bookstore
  •     
  • public string Name     
  • public string Address     
  • public string City     
  • public string State     
  • public Bookstore ()      
  • public Bookstore (string name, 
  • string address, 
  • string city,         
  • string state)     
  •         
  • Name  name         
  • Address  address         
  • City  city         
  • State  state     

37
Locator.asmx IV
38
Web Service Discovery DISCO
  • Cómo encontrar un servicio web?
  • Dos soluciones
  • DISCO
  • Mecanismo basado en ficheros para el
    descubrimiento de servicios locales
  • Universal Description, Discovery and Integration
    (UDDI)
  • Directorio global de servicios web implementado
    como un servicio web
  • Un fichero DISCO en tu servidor web describe los
    servicios web disponibles en él.
  • Fichero XML que tiene un enlace a un contrato
    WSDL
  • Los clientes pueden interrogar el fichero DISCO
    para encontrar servicios y sus contratos en forma
    de WSDL.
  • Para procesar un fichero DISCO se necesita saber
    la URL donde se encuentra definido
  • Para generar un fichero DISCO http//lturl-servici
    o-web.asmxgt?DISCO
  • También se pueden generar los documentos DISCO
    usando la utilidad disco.exe

39
Ejemplo DISCO
  • El documento DISCO contiene un enlace al contrato
    WSDL y un enlace a la documentación del mismo
    (docRef)
  • También provee la dirección e información binding
    del servicio

40
Creando un fichero default.disco
  • Apunta a otros documentos DISCO construyendo una
    jerarquía de búsqueda
  • Podríamos colgar este fichero de
    http//lturl-mi-empresagt/default.disco
  • El contenido de este fichero sería
  • lt?xml version1.0 encodinguft-8?gt
  • ltdiscovery
  • xmlnsxsi"http//www.w3.org/2001/XMLSchema-insta
    nce"
  • xmlnsxsd"http//www.w3.org/2001/XMLSchema"
  • xmlns"http//schemas.xmlsoap.org/disco/"gt
  • ltdiscoveryRef ref"http//localhost/ws/helloservi
    ce1.asmx?DISCO/"gt
  • ltdiscoveryRef ref"http//localhost/ws/helloservi
    ce2.asmx?DISCO/"gt
  • lt/discoverygt

41
UDDI
  • UDDI es una especificación para construir bases
    de datos distribuidas que permiten a las partes
    interesadas descubrir los servicios web de las
    otras
  • Similar a las páginas amarillas
  • Un portal UDDI es en si mismo un servicio web.
  • UDDI define un par de APIs SOAP
  • Una API para consultas (enquiry) para realizar
    consultas sobre compañías y sus servicios web
  • Una API para publicar los servicios web de una
    empresa.
  • Cualquiera lo puede consultar, pero el acceso a
    la API de publicación está normalmente
    restringido a miembros registrados.
  • https//uddi.ibm.com/testregistry/registry.html
  • http//uddi.microsoft.com

42
Clientes de Servicios Web I
  • Aplicaciones que usan o consumen servicios web
  • Herramienta Wsdl.exe de .NET facilita esta tarea
  • Web Service Proxy
  • Objeto local que provee una representación local
    de un Servicio Web
  • Wsdl.exe genera clases proxy de Servicios Web
  • Invocar métodos en el servicio web es tan
    sencillo como invocar métodos en el proxy
  • CalculatorWebService calc  new CalculatorWebServi
    ce ()
  • int sum  calc.Add (2, 2)

43
Clientes de Servicios Web II
  • Los métodos en el proxy tienen el mismo nombre
    que los nombres en el servicio web
  • El proxy encapsula los detalles de bajo nivel de
    invocación del servicio web
  • Invoca al servicio web traduciendo las
    invocaciones en SOAP y las respuestas en XML a
    los tipos de datos del proxy
  • Generar el proxy es tan sencillo como pasarle la
    URL de un WSDL al programa wsdl
    wsdl http//tempuri.org/ws/calc.asmx?wsdl
  • Si el servicio web no fue realizado con .NET se
    puede bajar el WSDL y pasarle el path local al
    fichero
  • Para dar un nombre al proxy usar el parámetro
    /outNombreProxy.cs
  • Si deseas generar el proxy en VB, usa
    /languagevb
  • Para encapsular en un namespace, usa
    /namespaceCalc
  • Se puede incluso cambiar el protocolo de
    invocación por defecto (SOAP)
  • /protocolhttpget 
  • /protocolhttppost
  • Con Visual Studio.NET sólamente hay que añadir
    una referencia web a tu proyecto y los proxies
    generados son añadidos a tu proyecto 

44
Cliente Web Sencillo
  • Pasos para escribir un cliente para Calc.asmx
  • wsdl http//localhost/ws/calc.asmx
  • Crear una nueva clase ClienteCalculadora.cs
  • Compilar esa clase csc CalcClient.cs
    CalculatorWebService.cs
  • Ejecutar ClienteCalculadora.exe

45
ClienteCalculadora.cs
  • using System
  • class MyApp
  • public static void Main ()
  • CalculatorWebService calc new
    CalculatorWebService ()
  • int sum calc.Add (2, 2)
  • Console.WriteLine ("2 2 " sum)

46
Invocaciones asíncronas
  • Si abres el fichero CalculatorWebService.cs
    observarás que wsdl genera wrappers tanto
    síncronos como asíncronos por cada método del
    servicio web
  • Las invocaciones asíncronas son útiles cuando la
    ejecución de un método puede tardar un largo
    periodo
  • Para el método Add del servicio web
    encontraríamos los siguientes métodos
  • BeginAdd ? inicia la petición asíncrona y
    devuelve control
  • IAsyncResult res  calc.BeginAdd (2, 2, null, null
    )
  • EndAdd ? se bloquea hasta que la invocación
    finaliza
  • int sum  calc.EndAdd (res)
  • res.IsCompleted ? esta propiedad indica si la
    invocación ha finalizado
  • Lo mejor es usar un AsyncCallback delegate que te
    avise a través de un método de callback cuando la
    invocación ha finalizado

47
Ejemplo Invocación Asíncrona I
  • using System
  • using System.Threading
  • class MyAsyncApp
  • private bool waitingOnReply true
  • public MyAsyncApp()
  • CalculatorWebService calc new
    CalculatorWebService ()
  • AsyncCallback ac new AsyncCallback
    (this.AddCompletedCallback)
  • IAsyncResult res calc.BeginAdd (2, 2, ac,
    calc)
  • // Se bloquea esperando entrada de consola
  • while (this.waitingOnReply) Thread.Sleep(500)
  • Console.WriteLine("Done!")

48
Ejemplo Invocación Asíncrona II
  • private void AddCompletedCallback (IAsyncResult
    res)
  • CalculatorWebService calc (CalculatorWebServic
    e)res.AsyncState
  • int sum calc.EndAdd (res)
  • Console.WriteLine ("Callback 2 2 " sum)
  • this.waitingOnReply false
  • public static void Main ()
  • new MyAsyncApp()

49
Invocando Servicios Web a través de Servidores
Web Proxy
  • Dos opciones
  • wsdl /proxyhttp//myproxy http//localhost/ws/cal
    c.asmx
  • El segundo modo es inicializar la propiedad Proxy
    del Servicio Web
  • El parámetro true de WebProxy indica que las
    invocaciones a direcciones locales no deben pasar
    por el servidor proxy
  • CalculatorWebService calc
  • new CalculatorWebService ()
  • calc.Proxy new WebProxy
  • (http//myproxy, true)
  • int sum calc.Add (2, 2)

50
Autenticación de Clientes de Servicios Web
  • Quién invoca mi servicio web? A quién tengo que
    cobrar?
  • Tres soluciones
  • Cada invocador autorizado debe pasar una clave
    como parámetro en sus invocaciones
  • Trasmitir nombres de usuario y contraseñas en
    cabeceras de autenticación HTTP
  • Transmitir credenciales en cabeceras SOAP

51
Cabeceras SOAP para Autenticación
  • Proteger método Add requiriendo que se introduzca
    un nombre de usuario y una cabecera
  • Para crear una cabecera SOAP es necesario definir
    una nueva clase que deriva de System.Web.Services.
    Protocols.SoapHeader
  • El atributo SoapHeader añadido a un método web le
    indica a ASP.NET que rechace invocaciones (lance
    SoapHeaderExceptions) a invocaciones del método
    sin esta cabecera
  • SoapHeader ("header", Required"true")
  • En el siguiente ejemplo este atributo mapearía
    AuthHeaders al campo header de la clase
    SafeService

52
SafeCalc.asmx
  • lt_at_ WebService Language"C" Class"SafeService"
    gt
  • using System
  • using System.Web
  • using System.Web.Services
  • using System.Web.Services.Protocols
  • public class AuthHeader SoapHeader
  • public string UserName
  • public string Password
  • class SafeService
  • public AuthHeader header
  • WebMethod
  • SoapHeader ("header", Requiredtrue)
  • public int Add (int a, int b)
  • if (header.UserName diego"

53
SafeCalc.asmx en detalle
  • El tipo de datos AuthHeader se define en el
    contrato WSDL.
  • Cuando wsdl genera el proxy también genera la
    definición de AuthHeader y añade el campo
    AuthHeaderValue a SafeService.
  • Si asigna un objeto de tipo AuthHeader a este
    campo se transmitirá una cabecerá SOAP con su
    valor.
  • La petición SOAP saliente tendría la siguiente
    forma
  • lt?xml version"1.0" encoding"utf-8"?gt
  • ltsoapEnvelope xmlnsxsi"http//www.w3.org/2001/X
    MLSchema-instance"
  • xmlnsxsdhttp//www.w3.org/2001/XMLSchema
  • xmlnssoap"http//schemas.xmlsoap.org/soap/enve
    lope/"gt
  • ltsoapHeadergt
  • ltAuthHeader xmlns"http//tempuri.org/"gt
  • ltUserNamegtdiegolt/UserNamegt
  • ltPasswordgtipinalt/Passwordgt
  • lt/AuthHeadergt
  • lt/soapHeadergt
  • ltsoapBodygt
  • ltAdd xmlns"http//tempuri.org/"gt
  • ltagt2lt/agt
  • ltbgt2lt/bgt
  • lt/Addgt

54
SafeCalcClient.cs
  • using System
  • class SafeCalcClient
  • public static void Main ()
  • SafeService calc new SafeService ()
  • AuthHeader header new AuthHeader ()
  • header.UserName diego"
  • header.Password ipina"
  • calc.AuthHeaderValue header
  • int sum calc.Add (2, 2)
  • Console.WriteLine ("2 2 " sum)

55
Más sobre Autenticación
  • Una variación de esta técnica es incluir un
    manejador de peticiones Application_Authenticate
    en el fichero Global.asax
  • Por último se puede configurar IIS para requerir
    acceso de autenticación al directorio donde se
    encuentra el servicio web, a través del fichero
    Web.config. Luego derivar la clase que implementa
    el servicio web de System.Web.Services.WebService
    y usar la propiedad User par obtener el nombre de
    usuario de invocador.

56
Manteniendo estado en Servicios Web
  • Los servicios web funcionan como el modelo de
    activación SingleCall de .NET Remoting
  • No mantienen estado como HTTP, sin embargo
  • Pueden hacer uso de las capacidades de manejo de
    estado de ASP.NET
  • Ejemplo Hola mundo que cuenta las veces que se
    invoca al servicio
  • Como si fuese el modo de activación Singleton de
    .NET Remoting

57
Servicio Web con Estado I
  • lt_at_ WebService Language"C" Class"HelloService2"
    gt
  • // file helloservice2.asmx
  • using System.Web.Services
  • WebService(Description"A stateful greeting Web
    service",
  • Namespace"http//tempuri.org/ws")
  • public class HelloService2 WebService
  • public HelloService2()
  • if (newSession)
  • newSession false // no longer a new
    session
  • numInst 0 // no instances so far
  • numGreet 0 // no greetings yet
    either
  • numInst
  • WebMethod(
  • Description"Greet by name.",
  • EnableSession true

58
Servicio Web con Estado II
  • WebMethod(
  • Description"Get number of greetings.",
  • EnableSession true
  • )
  • public int NumGreet()
  • return numGreet // return private property
  • WebMethod(
  • Description"Get number of times constructor
    invoked.",
  • EnableSession true
  • )
  • public int NumInst()
  • return numInst // return private property
  • private bool newSession
  • // wraps Session"newSession" in a private
    property
  • get

59
Servicio Web con Estado III
  • private int numGreet
  • // wraps Session"newGreet" in a private
    property
  • get
  • return (int) Session"numGreet"
  • set
  • Session"numGreet" value
  • private int numInst
  • // wraps Session"newInst" in a private
    property
  • get
  • return (int) Session"numInst"
  • set
  • Session"numInst" value

60
Servicio Web con Estado IV
  • Usa la propiedad Session para hacer referencia
    HttpSessionState
  • numInst guarda el número de veces que se invoca
    el constructor
  • numGreet el número de veces que se invoca el
    método Greet
  • El atributo WebMethod debe asignar la propiedad
    EnableSessiontrue para que el método pueda usar
    estado
  • Usaremos cookies en el cliente
  • Con el switch /state permitiendo cookies el
    número correcto de invocaciones es devuelto ?
    .NET Remoting client-activated

61
Cliente con Estado
  • // file helloclient2.cs
  • // compile csc /outhelloclient2.exe
    helloclient2.cs helloservice2.cs
  • namespace Hello
  • using System
  • using System.Net
  • class HelloClient2
  • public static void Main(string args)
  • HelloService2 h new HelloService2()
  • string argLine String.Join(" ",
    args).ToLower() " "
  • if (argLine.IndexOf("/state") gt 0)
  • h.CookieContainer new
    CookieContainer() // enable state
  • else
  • h.CookieContainer null // stateless
  • for (int i 0 i lt 3 i)
  • Console.WriteLine(h.Greet(Diego"))
  • Console.WriteLine("Num. Greet. 0",
    h.NumGreet())
  • Console.WriteLine("Num. Inst. 0",
    h.NumInst())

62
Otro Ejemplo Autenticación I
  • lt_at_ WebService Language"C" Class"StringCaseServ
    ice" gt
  • // file stringcaseservice.asmx
  • // description A web service to change string
    case. Requires user to login first.
  • using System.Web.Services
  • using System.Security
  • WebService(Description"A web service to change
    case. Requires login.",
  • Namespace"http//tempuri.org/ws")
  • public class StringCaseService WebService
  • WebMethod(Description"Login with username and
    password.",
  • EnableSession true)
  • public bool Login(string username, string
    password)
  • loggedIn false // logout existing user, if
    any
  • if (username diego" password
    ipina")
  • loggedIn true
  • return loggedIn
  • WebMethod(Description"Logout.",
  • EnableSession true)
  • public void Logout()

63
Otro Ejemplo Autenticación II
  • WebMethod(Description"Uppercase a string.
    Must be logged in to call.",
  • EnableSession true)
  • public string ToUpper(string s)
  • requireLogin()
  • return s.ToUpper()
  • WebMethod(Description"Lowercase a string.
    Must be logged in to call.",
  • EnableSession true)
  • public string ToLower(string s)
  • requireLogin()
  • return s.ToLower()
  • WebMethod(Description"Return string
    length.")
  • public int GetLength(string s)
  • // login not necessary...
  • return s.Length

64
Otro Ejemplo Autenticación III
  • private void requireLogin()
  • if (!loggedIn)
  • throw new SecurityException("Client not
    logged in!")
  • private bool loggedIn
  • get
  • if (Session"loggedIn" null) return
    false
  • return (bool) Session"loggedIn"
  • set
  • Session"loggedIn" value

65
Otro Ejemplo Autenticación IV
  • stringcaseservice.asmx permite la conversión a
    mayúsculas o minúsculas de un string
  • Lanza un SecurityException si el cliente no ha
    hecho login

66
Otro Ejemplo Autenticación V
  • // file stringcaseclient.cs
  • // compile csc /outstringcaseclient.exe
    stringcaseservice.cs stringcaseclient.cs
  • namespace StringCase
  • using System
  • using System.Net
  • class StringCaseClient
  • public static void Main(string args)
  • StringCaseService scs new
    StringCaseService()
  • scs.CookieContainer new
    CookieContainer() // enable state
  • string s "Hello"
  • Console.WriteLine("length of 0 1", s,
    scs.GetLength(s))
  • Console.WriteLine("logging in mmousesecret
    0",
  • scs.Login(loginPrueba",
    clavePrueba")
  • )
  • Console.WriteLine("logging in diegoipina
    0",
  • scs.Login(diego",
    ipina")
  • )
  • Console.WriteLine("ToUpper 0 1", s,
    scs.ToUpper(s))
  • Console.WriteLine("ToLower 0 1", s,
    scs.ToLower(s))

67
Otro Ejemplo Autenticación VI
  • Usamos cookies para soportar estado de sesiones
  • Para implementar bien un sistema de logeo, el
    servicio debería usar Secure Sockets Layer (SSL)
  • Si no el nombre de usuario y clave van en claro
    por la red
  • De hecho, debería implementarse un servicio de
    login en vez de como parte de un servicio mayor

68
Estado sin cookies
  • Se puede utilizar la identidad de un cliente para
    generar una clave con la sesión de duración
  • WebMethod(DescriptionLogin to Web Service)
  • public string Login(string username, string
    password)
  • if (isSubscriber(username, password))
  • string key genKey(userName,
  • Context.Request.UserHostAddre
    ss,
  • DateTime.Now.ToString())
  • addKey(key, username)
  • return key
  • return
  • WebMethod(DescriptionGreet by name)
  • public string Greet(string key, string name)
  • if (!validKey(key))
  • throw new SecurityException(Invalid
    session key)
  • return Hello, name

69
Emulando un Servicio Singleton
  • Esto es, todas las llamadas a un servicio web son
    ejecutadas por un mismo objeto
  • Vamos a user el estado por aplicación de ASP.NET

70
Servicio Web Singleton I
  • lt_at_ WebService Language"C" Class"HelloService3"
    gt
  • // file helloservice3.asmx
  • // description hello web service with
    application state info
  • using System.Web.Services
  • WebService(
  • Description"A stateful greeting Web service",
  • Namespace"http//tempuri.org/ws"
  • )
  • public class HelloService3 WebService
  • WebMethod(Description"Greet by name.")
  • public string Greet(string name)
  • numGreet
  • if (name "") name "Stranger"
  • return "Hello, " name "!"

71
Servicio Web Singleton II
  • WebMethod(Description"Get number of
    greetings.")
  • public int NumGreet()
  • return numGreet
  • private int numGreet
  • get
  • if (Application"numGreet" null) return
    0
  • return (int) Application"numGreet"
  • set
  • Application.Lock()
  • if (Application"numGreet" null)
  • Application"numGreet" 0
  • Application"numGreet" value
  • Application.UnLock()

72
Web Service Enhancements (WSE 2.0)
  • Web Service Enhancements (WSE)
  • http//msdn.microsoft.com/webservices/building/wse
    /default.aspx
  • Artículo de introducción http//msdn.microsoft.co
    m/webservices/building/wse/default.aspx?pull/libr
    ary/en-us/dnwse/html/programwse2.asp
  • Todo sobre los estádares ws- en
    http//www.specifications.ws/default.asp

73
Evitando URLs absolutas en Proxies
  • En CalculatorWebService.cs encontramos
  • public CalculatorWebService()
  • this.Url "http//localhost/ws/calc.asmx"
  • Para evitar modificar el cs cada vez que la
    localización del servicio web cambie, usar el
    switch urlkey
  • wsdl /urlkeyCalcUrl http//localhost/ws/calc.asmx
  • Ahora habría que asignar un valor a CalcUrl en la
    sección appSettings del fichero Web.config
  • ltconfigurationgt
  • ltappSettingsgt
  • ltadd key"CalcUrl" value"http//localhost/ws/
    calc.asmx" /gt
  • lt/appSettingsgt
  • lt/configurationgt

74
Una cliente Web SMTP I
  • lt_at_ WebService Language"C" Class"WebMailService
    " gt
  • // file WebMailService.asmx
  • // description SMTP mail Web service
  • using System
  • using System.Web.Services
  • using System.Web.Mail
  • WebService(
  • Description"An SMTP mail Web service",
  • Namespace"http//tempuri.org/ws"
  • )
  • public class WebMailService WebService
  • WebMethod(Description"Send an SMTP mail
    message")
  • public string Send(string from,
  • string to,
  • string subject,
  • string cc,

75
Una cliente Web SMTP II
  • try
  • MailMessage msg new MailMessage()
  • msg.From from
  • msg.To to
  • msg.Subject subject
  • msg.Cc cc
  • msg.Bcc bcc
  • msg.Body body
  • // set SMTP server here, if necessary
  • SmtpMail.SmtpServer "smtp2.ya.com"
  • SmtpMail.Send(msg)
  • return "OK"
  • catch (Exception e)
  • return "ERROR " e.Message

76
Una nueva era
  • Los servicios web tienen el potencial de cambiar
    la manera en que desarrollamos aplicaciones
    distribuidas
  • El paradigma SOA (Service Oriented Arquitecture)
    propone un modelo en el que Internet estará
    poblado por miles de servicios web, exponiendo
    diferente contenido y lógica de negocio a los
    invocadores de servicios.
  • .NET esconde HTTP, XML, y SOAP para que nosotros
    nos concentremos en la lógica de la aplicación en
    vez de en los detalles de comunicación con la
    parte servidora.
  • La computación distribuida a través de
    plataformas ha sido el sueño de los informáticos
    por mucho años
  • Con la llegada de los servicios web y las
    herramientas que facilitan su uso podemos por fin
    hacer ese sueño realidad.
  • CORBA lo intentó y es y será la solución más
    eficiente para la programación distribuida
  • Sin embargo por fin todos los mayores productores
    de la industria (incluido Microsoft) abogan por
    los Servicos Web

77
Nuevas Caracacterísticas .NET 2.0
  • ASP.NET Web Services soporta ahora tanto SOAP 1.1
    como protocolos SOAP 1.2
  • Desactivar o activar en elementos de ficheros
    machine.config y web.config
  • Ejemplo de atributos más comunes
  • WebServiceBinding(ConformsToWsiProfiles.BasicPro
    file1_1, EmitConformanceClaimstrue)
  • WebService(Namespace"Microsoft.Samples.XmlMessag
    ing.WebServices")
  • public class BPConformance_asmx
  • WebMethod
  • public string HelloWorldBP()
  • //implement method here
  • Nuevo método de invocaciones asíncronas
  • Selección en tiempo de ejecución de un servicio
  • Revisar ejemplos en WebServicesExamples

78
XML, Distribución y ComponentesTema 3
Aplicaciones Distribuidas Servicios Web
Preguntas y Sugerencias
  • Dr. Diego Lz. de Ipiña Gz. de Artaza
  • http//paginaspersonales.deusto.es/dipina
    (Personal)
  • http//www.morelab.deusto.es (Research Group)
  • http//www.smartlab.deusto.es (Research Lab)
  • http//www.ctme.deusto.es (Cátedra de Telefónica
    Móviles)
  • http//www.tecnologico.deusto.es
    (Tecnológico-Fundación Deusto)
Write a Comment
User Comments (0)
About PowerShow.com