Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

WCF – Interception des operations – comment rajouter du code lors de l’appel de méthode WCF – IOperationBehavior et IOperationInvoker

Lorsque l’on utilise WCF, dans certains cas, on aimerait pouvoir exécuter du code lorsque certaines méthodes sont appelées.

J’ai récemment eu ce besoin. Je travaillais sur un “Ajax-enabled WCF service” accessible depuis JavaScript. Pour différentes raisons j’utilisais l’attribut [WebGet] afin que les méthodes soient directement disponible via la méthode GET.

Malheureusement, lorsque je debuggais mon service, mes appels étaient mis en cache par le client, je devais donc vider mon cache afin de pouvoir rappeler mes méthodes. J’ai donc décidé de rajouter le code suivant au niveau de mes méthodes :

HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);

Mes appels n’étaient alors plus mis en cache!

Cependant je ne trouvais pas cette solution très élégante. J’ai donc cherché une solution me permettant d’intercepter tous les appels à mes méthodes.

Je me suis tourné vers la création d’un attribut implémentant IOperationBehavior. Cette interface possède 4 méthodes :

  • AddBindingParameters méthode permettant d’envoyer des données personnalisées aux bindings lors de l’exécution.

  • ApplyClientBehavior méthode permettant de modifier, examiner ou insérer des extensions lors de l'exécution de l’opération du côté du client.
    ==> on utilise cette méthode lorsque l’on veut faire un Behavior qui s’exécutera coté client.

  • ApplyDispatchBehavior : méthode permettant de modifier, examiner ou insérer des extensions dans l'exécution de l’opération du côté du service.
    ==> on utilise cette méthode lorsque l’on veut faire un Behavior qui s’exécutera coté serveur.

  • Validate pour confirmer qu'un OperationDescription remplit les conditions requises. Elle permet d'assurer qu'une opération dispose d'un certain paramètre de configuration activé, qu'elle prend en charge une fonctionnalité particulière et d'autres spécifications.

Ces méthodes seront appelées seulement lors de la création du service. Afin d’avoir la main sur l’exécution de chaque méthode/opération nous devons créer notre propre inspector. Nous allons pour cela créer une classe implémentant IParameterInspector.

Cette interface possède 2 méthodes aux noms explicites : AfterCall et BeforeCall.

Voici l’implémentation de mon OperationBehavior :

public class PouetAttribute : Attribute, IOperationBehavior { public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation) { } public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation) { dispatchOperation.ParameterInspectors.Add(new PouetInspector()); } public void Validate(OperationDescription operationDescription) { IOperationBehavior webGetOperationBehavior = operationDescription.Behaviors .FirstOrDefault(operationBehavior => operationBehavior is WebGetAttribute) as WebGetAttribute; if (webGetOperationBehavior == null) throw new NotSupportedException("WebGetAttribute is required for PouetAttribute"); } }

Ainsi que l’implémentation de mon ParameterInspector

public class PouetInspector : IParameterInspector { public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState) { if (HttpContext.Current != null) HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache); } public object BeforeCall(string operationName, object[] inputs) { return null; } }

Ainsi, au niveau de mon service, il ne me reste plus qu’a décorer ma méthode de l’attribut Pouet.

[Pouet] [WebGet] [OperationContract] public String Hello(String s) { // won't stay in client cache return s + " - " + DateTime.Now.ToLongTimeString(); }

Nous avons vus comment se greffer à l’appel de nos operations via un ParameterInspector. Les méthodes BeforeCall et AfterCall nous renseignent également sur les paramètres envoyés à notre opération ainsi que son retour. Il n’est cependant pas possible de faire des modifications. Un inspecteur ne permet que d’analyser, regarder, ce qu’il se passe. Si l’on souhaite modifier le comportement de l’opération, il faut alors passer par un OperationInvoker

Posted: dimanche 14 juin 2009 20:17 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

JeremyJeanson a dit :

Très pratique ce IOperationBehavior, et on peut l'utiliser pour implanter des fonctionnalités inexistantes.

Dans mon cas je l'ai mis en place pour obtenir une authentification avec WCF et SilverLight :

http://www.jjeanson.fr/1/Post.aspx?post=66a112f6-3143-2d2a-f3af-f2d5a3993f23

# juin 15, 2009 08:44
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01

- SharePoint Online: Script PowerShell pour supprimer une colonne dans tous les sites d’une collection par Blog Technique de Romelard Fabrice le 11-27-2018, 18:01