Sei sulla pagina 1di 7

dnm.plataforma.

net

David Perona

Servicios Web nativos con SQL Server 2005


Con el uso de HTTP EndPoints, podemos exponer a la Web tanto los procedimientos almacenados, como las UDF de nuestra base de datos. Sin la necesidad de usar ninguna otra herramienta ni abrir puertos TCP para SQL Server 2005.

<< En este artculo veremos cmo mediante el uso de los HTTP


EndPoints podemos exponer a la Web tanto los procedimientos almacenados como las UDF de nuestra base de datos prcticamente sin esfuerzo. Estos objetos nos permitirn crear interfaces de acceso va HTTP o TCP para SOAP, T-SQL, Service Broker e incluso para DBMirroring. Nos centraremos en el objetivo de este artculo y hablaremos exclusivamente de la creacin de HTTP/SOAP EndPoints en SQL Server. En cierta forma, esta habilidad ya estaba disponible con SQL Server 2000. SQLXML 3.0 nos provea de un conjunto de herramientas que nos permitan enviar y recibir datos en formato XML y adems permita crear servicios Web con posibilidad de ejecucin de procedimientos y UDF, al igual que los EndPoints. Una de las mejoras ms notables que se han aadido con la aparicin de los EndPoints es la supresin de IIS para gestionar las peticiones HTTP de los servicios Web. Pero alguien debe hacerse cargo de estas redirecciones, por lo que para poder crear estos servicios necesitaremos que la mquina en la que va a residir SQL Server funcione bajo Windows 2003 o Windows XP con SP2. Ya que ser http.sys el encargado de realizar todo este trabajo. El funcionamiento de http.sys (HTTP Listener Process) es el siguiente. Imaginemos que hemos creado un EndPoint en la direccin http://miServer/dotnetmania. Al crearlo, queda automticamente registrado en http.sys. Cuando llega una peticin SOAP, la recoge en primera instancia el servidor especificado en la llamada, en nuestro caso miServer. El siguiente paso es comparar el resto de la cadena con la lista de EndPoints que el servidor tiene registrados y, en

caso de coincidencia, ste enva la peticin directamente al EndPoint correspondiente, omitiendo as el paso por IIS. En la figura 1 vemos claramente diferenciadas las distintas metodologas.

Figura 1

Veamos un ejemplo
Ahora que ya hemos visto quines somos y hacia dnde vamos, es el momento de entrar en materia. Para crear un servicio Web en SQL Server 2005 son necesarios tres pasos: 1. Crear el origen de datos. Un procedimiento almacenado, una UDF o incluso, como veremos ms adelante, un proceso batch. 2. Crear un EndPoint especificando algn WebMethod que nos proporcione el acceso a esos datos. 3. Crear una aplicacin cliente que solicite esos datos. En este ejemplo crearemos un servicio Web que nos ofrecer una lista de todos los artculos de los

David Perona Martnez trabaja como desarrollador para Clave Informtica, S.L. Es Tcnico Superior en Administracin de Sistemas Informticos y MCAD.NET.

<< dnm.plataforma.net
que disponemos y que al seleccionarlo, cualquiera de ellos nos ensear su foto. Para ello, usaremos la base de datos AdventureWorks que adjunta SQL Server 2005. El primer paso ser crear los objetos que nos ofrecern los datos. En nuestro caso crearemos un procedimiento almacenado, que podemos ver en el fuente 1, y que nos devolver un listado bsico (cdigo y nombre) de la tabla de Productos. Sencillo, verdad? Ya tenemos nuestro EndPoint creado y listo para su uso. Podremos comprobar su correcto funcionamiento si por ejemplo desde cualquier navegador le pedimos que nos devuelva el documento WSDL (Web Service Description Language) correspondiente al servicio. Con http://miServer/dotnetmania?WSDL nos mostrar una pgina con toda la informacin del EndPoint. Ahora que tenemos todos los requisitos a punto, crearemos una aplicacin muy simple que nos mostrar el listado de artculos y que, al movernos por ellos, nos mostrar las fotos de cada uno. Para ello, abrimos Visual Studio y creamos un nuevo proyecto Windows, al que llamaremos EndPoints. Al formulario lo llamaremos frmEndPoint, y aadiremos los siguientes controles: Un DataGridView, que llamaremos oGrid. Un PictureBox, que llamaremos PicImagen. Un Label, que llamaremos LblImagen. Un Button, que llamaremos Button1. Con lo que conseguiremos que tenga una apariencia parecida la que vemos en la figura 2.

CREATE PROCEDURE dbo.GetArticulos AS SELECT P.ProductID, P.Name FROM Production.Product P ORDER BY P.ProductID

Fuente 1

En el fuente 2 tenemos el segundo procedimiento almacenado que nos har falta. Este nos devuelve la imagen y el nombre del artculo que le pasemos como parmetro, de la tabla ProductPhoto.

CREATE PROCEDURE dbo.GetImagenArt @ProductID int AS SELECT PF.LargePhoto, PF.LargePhotoFileName FROM Production.Product P LEFT JOIN Production.ProductProductPhoto PPF ON P.ProductID = PPF.ProductID LEFT JOIN Production.ProductPhoto PF ON PPF.ProductPhotoID = PF.ProductPhotoID WHERE P.ProductID = @ProductID

Fuente 2

Con los procedimientos almacenados ya creados, el nico paso que nos queda es crear nuestro EndPoint. Para ello, usaremos el cdigo del fuente 3.

Figura 2

Fuente 3

<<dotNetMana
31

CREATE ENDPOINT sql_DotNetMania STATE = STARTED AS HTTP ( PATH = /DotNetMania, AUTHENTICATION = (INTEGRATED), PORTS = (CLEAR), SITE = miServer) FOR SOAP ( WEBMETHOD GetProducts (Name=AdventureWorks.dbo.GetArticulos), WEBMETHOD GetImageProd (Name=AdventureWorks.dbo.GetImagenArt), BATCHES = DISABLED, WSDL = DEFAULT, DATABASE = AdventureWorks, NAMESPACE = http://Adventure-Works/)

Lo primero que debemos hacer es aadir una referencia Web a nuestro proyecto. Cuando se nos pregunte dnde se encuentra nuestro servicio, simplemente escribiremos la direccin del WSDL (que en nuestro caso ser http://miserver/dotnetmania?WSDL). Una vez que lo tengamos localizado, le daremos el nombre Local_EndPoint. En el fuente 4 podemos ver el cdigo del ejemplo. Como con cualquier servicio Web, tendremos que importar el espacio de nombres de la clase de este servicio en el encabezado del mdulo en el que lo vayamos a usar. Importaremos tambin los espacios System.Data y System.Data.SqlClient, que nos harn falta para el desarrollo del ejemplo. En la cabecera de la clase inicializamos el objeto que contendr el servicio y un array de objetos, pues-

<< dnm.plataforma.net
Imports System.Data Imports System.Data.SqlClient Imports EndPoints.local_EndPoint Public Class frmEndPoint Dim myEndPoint As New EndPoints.local_EndPoint.sql_DotNetMania Dim oReturned() As Object Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim oSet As New DataSet oGrid.AllowUserToAddRows = False oGrid.AllowUserToDeleteRows = False oGrid.EditMode = DataGridViewEditMode.EditProgrammatically myEndPoint.Credentials = System.Net.CredentialCache.DefaultCredentials oReturned = myEndPoint.GetProducts If oReturned(0).ToString = System.Data.DataSet Then oSet = CType(oReturned(0), DataSet) oGrid.DataSource = oSet oGrid.DataMember = oSet.Tables(0).ToString oGrid.Refresh() End If End Sub Private Sub oGrid_RowEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles oGrid.RowEnter Dim oSet As New DataSet Dim oByte() As Byte Dim oRow As DataRow If Not oGrid.Item(e.ColumnIndex, e.RowIndex).Value.ToString.Trim = Then myEndPoint.Credentials = System.Net.CredentialCache.DefaultCredentials oReturned = myEndPoint.GetImageProd(oGrid.Item(0, e.RowIndex).Value.ToString.Trim) If oReturned(0).ToString = System.Data.DataSet Then oSet = CType(oReturned(0), DataSet) oRow = oSet.Tables(0).Rows(0) oByte = oRow(0) PicImagen.Image = New Bitmap(New System.IO.MemoryStream(oByte)) lblImagen.Text = oRow(1) End If End If End Sub End Class

Fuente 4

to que el EndPoint no siempre nos va a devolver objetos de tipo DataSet. Dependiendo del tipo de consulta, podemos obtener distintos elementos, como podemos ver en la tabla 1. A continuacin, pasaremos nuestras credenciales al servicio Web. Y si son aceptadas, ya podemos acceder Elemento en SQL Server
Resultado de SELECT Resultado de SELECT especificando FOR XML Raise error Parmetro de salida

<<dotNetMana

Filas Afectadas Valor devuelto por una consulta

a todas los WebMethods que hayamos definido en nuestro EndPoint. Si nos fijamos en el cdigo de Button1, est comprobando el tipo que ha devuelto la funcin GetProducts; en caso de ser un DataSet, lo asigna a un objeto DataSet local a la funcin y lo establece como DataSource del DataGridView. Con esto ya tendremos cargada toda la informacin de los artculos en la rejilla. Objeto .NET El ltimo paso es comprobar el System.Data.DataSet movimiento por las filas de la rejilla para ir cargando las imgenes. System.Xml.XmlElement Como puede comprobarse, el cdiSqlMessage (del WSDL) go es muy parecido al de la carga de SqlParameter (del WSDL) los artculos. SqlRowCount (del WSDL) Todo el cdigo de este ejemplo puede descargarse de www.dotnetmaSystem.Int32 Tabla 1 nia.com.

32

<< dnm.plataforma.net
SITE Mediante este parmetro especificamos el nombre de la mquina en la que reside el servicio Web. Si omitimos este parmetro, se asumir el valor *, que indica que la escucha se efectuar sobre todos los posibles hosts de la mquina que no estn explcitamente reservados. Otro posible valor es +, que indicar que la operacin de escucha se efectuar sobre todos los posibles hosts de la mquina, pero sin discriminar los que estn reservados. Otros valores aceptados por esta propiedad pueden ser LocalHost, el nombre DNS o incluso la direccin IP de la mquina. Cuando creamos un EndPoint, implcitamente estamos reservando una URL para nuestro servicio. Por ejemplo, en el caso que nos ocupa, si observamos el fuente 5, estamos implcitamente reservando la direccin http://miServer:80/dotnetmania. Esto quiere decir que mientras nuestro servidor est en ejecucin, http.sys redireccionar cualquier peticin que se haga a esta direccin a SQL Server. Sin embargo, podr ser usada por cualquier otro servicio cuando el servidor est detenido. Para evitar esta situacin, una buena prctica es reservar la URL explcitamente, con ayuda del procedimiento almacenado sp_reserve_http_namespace. La sintaxis es la siguiente: sp_reserve_http_namespace N'http://miServer:
HTTP ( PATH = /DotNetMania, AUTHENTICATION = (INTEGRATED), PORTS = (CLEAR), SITE = miServer) FOR SOAP ( ...

Con este sistema, haremos accesible informacin de nuestro sistema, va servicios Web

Entrando en detalle
En la propia instruccin de creacin del EndPoint podemos especificar el nombre que le queremos dar, un login vlido para SQL Server o Windows, que ser el propietario de dicho servicio y el estado del servicio una vez que se haya creado.
CREATE ENDPOINT AUTHORIZATION = usrDavid STATE = STARTED

<<dotNetMana
33

Los posibles valores para el parmetro STATE, son Started, Stopped (valor por defecto) y Disabled. Cuando el servicio est en el estado Stopped, sigue escuchando y recibiendo peticiones, aunque devuelve un mensaje de error al cliente. Por el contrario, cuando est en el estado Disabled, est fsicamente desconectado, no recibe las peticiones. Obviando la propia definicin del EndPoint, el resto de la sintaxis consta de dos partes claramente diferenciadas: En la primera parte, especificamos el protocolo de trasporte (TPC o HTTP), el servidor en el que residir nuestro servicio, el puerto de escucha, el mtodo de autentificacin del EndPoint y una lista de direcciones IP a la que queramos restringir el acceso. PATH Especifica la URL de nuestro EndPoint, En nuestro caso, /dotnetmania. Esta es la direccin que tendremos que escribir para acceder al servicio. Con lo que la sintaxis queda de la siguiente forma: http://miServer/dotnetmania. AUTHENTICATION Especifica el tipo de autentificacin que usaremos para nuestro servicio. Los posibles valores son: Basic, Digest, Integrated (usar la configuracin de Windows), NTLM o Kerberos. PORTS Indica el tipo de puerto a usar. Los posibles valores son CLEAR (HTTP) o SSL (que aceptar HTTPS). Clear_Port y SSL_Port Permiten especificar puertos distintos a los que se asumen por defecto al indicar el parmetro PORTS. Por defecto, la opcin CLEAR usar el puerto 80 y la opcin SSL el 443.

Fuente 5

80/DotNetMania'. De esta forma, la URL estar per-

manentemente ocupada y evitaremos conflictos de direccin. De la misma forma, para cancelar la reserva de esta direccin, ejecutaremos lo siguiente: sp_delete_http_namespace_reservation N' N'http://miServer:80/DotNetMania'. Si, por el contrario, estuvisemos omitiendo el parmetro SITE, o le estuvisemos pasando como valor un *, la reserva que se creara sera la siguiente: http://*:80/dotnetmania. En la segunda parte de la sintaxis de un EndPoint, informamos sobre el tipo de EndPoint que estamos creando y a qu peticiones va a estar escuchando. Podremos especificar tanto SOAP, como T-SQL, Service Broker o incluso Database Mirroring. Para cada uno de ellos, tendremos la posibilidad de especificar un subconjunto de parmetros para definir su configuracin. Nos centraremos en SOAP, que es el objetivo de este artculo. Tendremos que definir como mnimo un

<< dnm.plataforma.net
reducido del anterior y se diferencia en que esta versin mapea todos los tipos de SQL Server en tipos nativos XSD. WEBMETHOD Con este parmetro indicamos los distintos mtodos que estarn disponibles para el servicio. A cada uno de ellos deberemos asociarles un procedimiento almacenado o una funcin al que quedar enlazado. Podremos definir varios WebMethods por EndPoint. BATCHES Indica si es posible la utilizacin de TSQL. WSDL Indica dnde est el XSD que ser devuelto al cliente cuando nos lo solicite. DATABASE Especifica la base de datos en la que reside nuestro servicio. NAMESPACE Especifica el espacio de nombres para nuestro EndPoint. FORMAT Indica qu posibles tipos ofrecer el servicio como respuesta. {ALL_RESULTS, ROWSETS_ONLY, NONE}. LOGIN_TYPE {MIXED, WINDOWS}.

Podremos especificar tanto SOAP, como T-SQL, Service Broker o incluso Database Mirroring

WebMethod, que enlazaremos a un procedimeinto almacenado o una UDF. Indicaremos si dejamos habilitada la posibilidad de ejecutar Batches sobre el servidor. Es altamente recomendable dejar esta opcin deshabilitada (el estado por defecto), a menos que sea de vital importancia tenerla habilitada, lo que nos obligar a extremar al mximo las medidas de seguridad de nuestro servicio. No hace falta que os explique lo que podra pasar si no somos totalmente meticulosos en este aspecto. Adems, podremos definir otras propiedades como quin ser el encargado de generar la informacin WSDL que ofreceremos. Por defecto, es el mismo servicio el encargado de generar este fichero, aunque tenemos la opcin de crear un procedimiento almacenado y que sea ste el que, a peticin del cliente, ofrezca un XSD personalizado. Si usamos la opcin Default, el EndPoint puede producir dos versiones distintas del mismo XSD. Con http://miServer/dotnetmania?wsdl, devolver un XSD con tipos derivados, para un correcto mapeo de los tipos de datos ms complejos que se pueden almacenar en SQL Server. Por otra parte, podremos usar http://miServer/ dotnetmania?wsdlsimple . Este es un formato
Tipo de Autentificacin

Configurando aspectos de seguridad


Tipos de autentificacin
Si os fijis, en la opcin AUTHENTICATION del servicio Web no hay posibilidad de especificar la autentificacin annima, detalle ste que nos puede evitar ms de un problema. Echemos un vistazo al resto de posibles tipos.

Configurando permisos sobre EndPoints


La sintaxis para ofrecer permisos a un EndPoint es muy parecida a la que se utiliza para el resto de objetos de SQL Server.

Descripcin

BASIC

Este mtodo se caracteriza por aadir a la cabecera HTTP, el usuario y la contrasea codificados en Base64. Requiere la utilizacin de SSL en la definicin del servicio, ya que estamos pasando la informacin de la conexin en la misma peticin y es relativamente fcil decodificar un cdigo en Base64. Al igual que el mtodo BASIC, pasa tanto el usuario como la contrasea a travs de la red, pero esta vez codificados mediante MD5 (algoritmo de codificacin unidireccional). Con este tipo de autentificacin slo podremos especificar usuarios de un dominio de Windows; no acepta usuarios locales de la mquina. Cuando el servidor recibe esta informacin,compara el hash de la contrasea con el que qued almacenado cuando se cre el usuario. Como nota, diremos que este tipo de autentificacin slo acepta encriptacin MD5 bajo controladores de dominio de Windows Server 2003. Es el mecanismo de autentificacin de Windows 95, 98 y NT 4.0. Ofrece un sistema ms completo que Basic y Digest.A partir de Windows 2000, se implement con SSPI. Estndar en Internet. Soportado a partir de Windows 2000 por medio de SSPI. Cuando se usa este tipo, SQL Server asocia su instancia principal con la cuenta que la est ejecutando. Este tipo prepara a nuestro EndPoint para que responda a los tipos de autentificacin NTLM y KERBEROS. Tabla 2

DIGEST

NTLM KERBEROS

<<dotNetMana

INTEGRATED

34

<< dnm.plataforma.net
GRANT [Tipo_de_accin] ON ENDPOINT::Nombre_EndPoint TO SQL_Login WITH GRANT OPTION Tipo_de_accin puede tomar valores como Alter, Connect, Control, Take Ownership y View Definition. Para ejecutar este comando, es necesario que estemos en la base de datos Master. Por ejemplo, el comando: USE Master Go GRANT CONNECT ON ENDPOINT::sql_DotNetMania TO usr_Clave

El apartado ms importante es la configuracin de los aspectos de seguridad de estos objetos

Otorga permisos para poder usar el EndPoint con nombre sql_dotnetmania al usuario usr_Clave. El parmetro WITH GRANT OPTION indica que usr_Clave estar capacitado para asignar este mismo permiso a otros logins. Para denegar cualquier tipo de accin sobre un servicio:
USE Master Go DENY [Tipo_de_accin] ON ENDPOINT::Nombre_EndPoint TO SQL_Login CASCADE

El funcionamiento es el mismo. El parmetro CASCADE indica que se debe propagar la denegacin del permiso a todos los logins a los que el denegado se lo haya garantizado previamente. Y para eliminar cualquier permiso establecido o denegado previamente, usaremos:
USE Master Go REVOKE [Tipo_de_accion] ON ENDPOINT::Nombre_EndPoint [FROM | TO] SQL_Login

o grupos de personas que necesiten tener acceso a estos servicios. Desde luego, nunca debemos asignar ningn permiso al rol pblico. Usar SSL para informacin confidencial. De este modo permitiremos la encriptacin de los contenidos confidenciales que circulen por la red. SQL Server requiere la configuracin de un certificado. En este punto, tendremos especial cuidado, pues si configuramos un certificado para el puerto 443 (puerto por defecto de SSL), estaremos aplicndolo a todo el trfico que circule por ese puerto. Por ejemplo, IIS puede estar recibiendo informacin por el mismo puerto. En este caso, el certificado les afectara a los dos. Configurar estos servicios en servidores que estn tras un firewall. Asegurarse de que la cuenta Invitado est deshabilitada en el sistema operativo. Otro aspecto importante a tener en cuenta es el rendimiento de estos servicios. Si la solucin maneja mucho cdigo XML o si hace un uso intensivo de procedimientos almacenados, el rendimiento que pueden ofrecer los HTTP EndPoints es considerablemente bueno, puesto que permiten compartir la lgica de negocio fcilmente con otras aplicaciones. Por otro lado, si nuestra aplicacin hace uso de procesos transaccionales crticos, o trabajamos con tipos muy grandes, como Binary Image o Text, el rendimiento no ser optimo. Tened en cuenta la sobrecarga que se genera al tener que convertir estos objetos en mensajes SOAP. Adems, estamos hablando de un formato basado en texto, diferente al formato binario nativo de SQL Server, Tabular Data Stream (TDS). Esto significa que el tamao de los datos a enviar aumentar entre un 20 y un 30%.

Algunos consejos
Como contrapartida a la facilidad de creacin de HTTP EndPoints, tenemos que tener en cuenta que estamos trabajando con un servicio Web como cualquier otro, pero que est directamente conectado a la base de datos, por lo que el nivel de seguridad tiene que ser extremo. Aqu se exponen las prcticas bsicas para asegurar nuestros servicios Web. Usaremos autentificacin Kerberos. En la propiedad AUTHENTICATION, especificaremos siempre Kerberos, o bien Integrated, que permitir a Windows seleccionar la autentificacin NTLM o Kerberos. Limitaremos tanto como podamos el alcance de los permisos que otorguemos. Siempre intentaremos asignar permisos exclusivamente a personas

Conclusin
Con HTTP Endpoints, SQL Server 2005 nos ofrece una forma sencilla de crear interfaces para servicios Web, Service Broker e incluso para DB-Mirroring. Ahora nos ser mucho ms fcil acceder a nuestro servidor SQL Server desde lugares desde los que antes nos era muy trabajoso, como pudieran ser aplicaciones en sistemas no Windows, dispositivos mviles y un largo etctera.

<<dotNetMana
35

<< dnm.plataforma.net

<<dotNetMana
36

Potrebbero piacerti anche