DarioSantarelli.Blog("UgiDotNet");

<sharing mode=”On” users=”*” />
posts - 176, comments - 105, trackbacks - 3

My Links

News


This is my personal blog. These postings are provided "AS IS" with no warranties, and confer no rights.




Tag Cloud

Archives

Post Categories

My English Blog

[WCF] IOperationBehavior e IParameterInspector

Dal punto di vista della flessibilità, ritengo che WCF sia una delle tecnologie più potenti attualmente disponibili per lo sviluppo di applicazioni orientate ai servizi. In particolare, una delle caratteristiche che apprezzo maggiormente è la facilità di personalizzazione del comportamento runtime degli OperationContract sia client-side che service-side ( pratica per altro molto usata nel WCF REST Starter Kit :D ).
In questo post volevo soffermarmi proprio su questo aspetto, mostrando un semplice esempio di implementazione dell’interfaccia IOperationBehavior, che per l'appunto definisce quattro metodi finalizzati all'estensione del runtime behavior di un'operation:

  • AddBindingParameters : serve per aggiungere nuovi elementi di binding utilizzabili dall'operation in fase di esecuzione. 
  • ApplyClientBehavior : viene chiamato client-side 
    • prima che il contenuto della richiesta sia serializzato e inviato al service
    • dopo che la risposta è stata deserializzata ma prima che i valori restituiti vengano forniti al metodo proxy
  • ApplyDispatchBehavior : viene chiamato service-side dopo la deserializzazione dei parametri, ma prima che essi siano forniti all'operation del service.
  • Validate : permette di verificare che l'operation soddisfi dei criteri custom ( es. autorizzazioni ).

Vediamo ora una semplice implementazione che mette in evidenza come sia veramente semplice agganciare un OperationBehavior ad un OperationContract  tramite un attributo. Gli ambiti di applicazione sono veramente tanti: ad esempio potremmo usare questa tecnica service-side per eseguire della logica custom prima e dopo l’invocazione di un’operation da parte di un client. Nello specifico, supponiamo di voler scrivere in un file di log sul server sia i parametri di input passati all'operation che il risultato dell'invocazione. Per ottenere questo scenario necessitiamo anzitutto della definizione di un oggetto che sia in grado di ispezionare i parametri dell'operation sia prima che dopo la chiamata: in altre parole abbiamo bisogno di un IParameterInspector. Questa interfaccia definisce due metodi, BeforeCall(…) e AfterCall(…), che ci permettono di inserire della logica custom ( sempre sia client-side che service-side ) per accedere alle informazioni inerenti una operation ed i relativi parametri di input/output nelle fasi immediatamente precedenti e successive all’invocazione.
Partiamo dunque dal nostro IParameterInspector:

public class ParameterLogInspector : IParameterInspector
{
  
private FileInfo _logFileInfo;

  
public ParameterLogInspector(string fileName)
  
{
    
_logFileInfo = new FileInfo(fileName);
    
if (!_logFileInfo.Exists) _logFileInfo.Create();      
  
}

  
#region IParameterInspector Members
  

  
public object BeforeCall(string operationName, object[] inputs)
  
{
    
StringBuilder sb = new StringBuilder();
    
foreach (object input in inputs) sb.AppendFormat("{0};", input.ToString());
    
this.Log(string.Format("Operation \"{0}\" is calling... inputs: {1}", operationName, sb.ToString()));
    
return null;
  
}       

   public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
  
{
    
this.Log(string.Format("Operation \"{0}\" called. returnValue: {1}",operationName,returnValue.ToString()));            
  
}
  
  
#endregion

  
private void Log(string message)
  
{
    
using (StreamWriter sw = _logFileInfo.AppendText())
    
{
      
sw.WriteLine(string.Format("{0}> {1}", DateTime.Now.ToString(), message));
    
}
  
}
}


Quindi, ci posizioniamo all'interno del metodo ApplyDispatchBehavior(...) semplicemente per aggiungere il nostro IParameterInspector alla collection ParameterInspectors dell'oggetto DispatchOperation (che rappresenta l'operation service-side) :


public class ParametersLog : Attribute, IOperationBehavior
{
 
public string FileName { get; set; }

 
#region IOperationBehavior Members

  ...

 
public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
 
{
  
dispatchOperation.ParameterInspectors.Add(new ParameterLogInspector(this.FileName));
 
}

  ...
 

 
#endregion
}


Il gioco è fatto: non rimane che decorare l'OperationContract di interesse con il nostro attributo ParametersLog per ottenere l' estensione del runtime che ad ogni chiamata scriverà in un file di log i valori dei parametri di input/output .

[ServiceContract]
public interface IAuthentication
{
 
[OperationContract]
 
[ParametersLog(FileName="C:/log.txt")]
 
UserInfo Login(string userName, string password);

 
[OperationContract]
 
void Logout(string userName);
}


Technorati Tag:

Print | posted on Tuesday, February 24, 2009 3:02 PM | Filed Under [ WCF ]

Feedback

Gravatar

# re: [WCF] IOperationBehavior e IParameterInspector

Molto interessante.

Aggiunto ai preferiti.
2/25/2009 9:43 AM | Foffo
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET