Cercar en aquest blog

31/10/10

Distribució del negoci (PART IV)

Bé, en aquest post exposaré com crear un client d' un servei WCF. Fer-ho amb la opció del VS és bastant fàcil. El que faré és exposar com fer una classe genèrica que sigui capaç de generar un client transparent per qualsevol servei, coneixent només les operacions d'aquest (interficie) i els missatges que exposa per interactuar amb ell (contractes de dades).

Primer de tot creerem una llibreria que anomenarem TransparentProxy. I dins d'ella una interfície on definirem les operacions que ha de complir el proxy i una classe que ens implementarà un proxy.



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TransparentProxy
{
    interface IProxy<T>
        T Client {get;}
        void Close();
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TransparentProxy
{
    public class Proxy<T>: IProxy<T>
    {
        public T Client
        {
            get { throw new NotImplementedException(); }
        }
        public void Close()
        {
            throw new NotImplementedException();
        }
    }
}

Un cop fet això començarem a implementar el proxy. Per fer-ho em de tenir uns mínims coneixements de WCF.
Bàsicament per conectar-nos a un servei necessitem saber:
  1. La adreça on es troba.
  2. Com és vincualen el client i el servei (binding).
  3. El tipus de seguretat en el transport i el missatge.
  4. I si cal, usuari i clau d'accés. SEMPRE HEM D'UTILTZAR UN MECANISME DE AUTENTIFICACIÓ I AUTORITZACIÓ.
I saber que tot això ho trobem al "assembly" System.ServiceModel .

Realment gran part de tot l'esmentat depén del tipus de vincul que volem implementar, i per tant en una primera versió, es una dada que se li ha de comunicar al proxy.

Així doncs us presento una mínima expressió d'un proxy transparent, molt bàsic, però útil per començar a especialitzar-lo cap els nostres serveis. Jo, per exemple, utilitzo serveis federats amb ADFS 2.0, i m'he creat un proxy transparent capaç de conectar-se a qualsevol dels meus serveis.







using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Channels;

namespace TransparentProxy
{
    public class Proxy<T>: IProxy<T>
    {
        ChannelFactory<T> ch;
       
       public Proxy(Binding bind, string addr , string userName, string password )
        {

            ch = new ChannelFactory<T>(bind, new EndpointAddress(addr));
            if ((userName != null) && (password!=null))
            {
                // És un exemple, les credencials poden ser passades
                // d'altres maneres, certificats, tokens, etc.
                // Cal docuementar-se.
                
                ch.Credentials.UserName.UserName = userName;
                ch.Credentials.UserName.Password = password;
            }
        }
        
        public T Client
        {
            get { return ch.CreateChannel(); }
        }


        public void Close()
        {
            ch.Close();
        }
    }
}
 


Exemple d'utilització

WSHttpBinding bind=new WSHttpBinding();
bind.Security.Mode = SecurityMode.Message;
bind.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
bind.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
bind.Security.Message.NegotiateServiceCredential = true;
TransparentProxy.IProxy proxy = new TransparentProxy.Proxy(bind, "http://localhost:53538/WCFGAPService/Service.svc", null, null);
IList res = proxy.Client.LListarMetges();
proxy.Close();
return res;


En el proper post conectarem un client Winforms amb el servei, utilitzant el proxy transparent.