Ecrire un "WCF Virtual Path Provider"

Une fois que le fichier .svc est créé et que vous tentez d'y accéder à travers votre navigateur web, vous recevrez une erreur de type "404-Not found".
Ce problème est dû a un mauvais fonctionnement du VirtualPathProvider implémenté pas SharePoint, dans la classe SPVirtualPathProvider, et qui plante lorsqu'on lui présente des URL commencent avec le caractère "~".

Pour résoudre ce problème il suffit de créer son propre VirtualPathProvider. Il est important de souligner que cette implémentation ne reprendra pas tous le travail du SPVirtualPathProvider, mais elle viendra se greffer aprés lui grâce au fonctionnement en chaine des VirtualPathProvider, ainsi l'attribut "Previous" de notre provider pointera sur le SPVirtualPathProvider.

Mais avant tout il faut créer une classe qui hérite de "System.Web.Hosting.VirtualPathProvider.

  public class WCFVirtualPathProvider : VirtualPathProvider
    {

        public override string CombineVirtualPaths(string basePath, string relativePath)
        {

            return Previous.CombineVirtualPaths(basePath, relativePath);

        }

         //...
        // Les autres méthodes ne sont pas mentionnées car elles ne font qu'appeler l'attribut Previous comme ci-dessus

        public override bool FileExists(string virtualPath)
        {

            string fixedVirtualPath = virtualPath;

            if (

                  virtualPath.StartsWith("~") &&

                  virtualPath.EndsWith(".svc")

               )
            {

                fixedVirtualPath = virtualPath.Remove(0, 1);

            }

            return Previous.FileExists(fixedVirtualPath);

        }

        protected override void Initialize()
        {

            base.Initialize();

        }

    }

Donc pour reprendre un peu le fonctionnement de cette classe, nous n'allons modifier que la méthode "FileExists", elle se chargera d'enlever le tilde "~" du path reçu et le fera passer pour traitement au SPVirtualPathProvider.
Maintenant il faut enregistrer notre VirtualPathProvider et le chainer au SPVirtualPathProvider. Pour ce faire nous devons exécuter les deux lignes de codes qui suivent:

WCFVirtualPathProvider wcfVPP = new WCFVirtualPathProvider();

HostingEnvironment.RegisterVirtualPathProvider(wcfVPP);

Or il faut veiller à n'exécuter ce code qu' une SEULE fois, et ceci a chaque éxecution de "IISRESET" et/ou modification de web.config. Car ASP.NET oublie les VirtualPathProvider qu'il utilisait après chaque IISRESET.

La façon la plus élégante de régler ce problème c'est de placer ce code dans un HttpModule, qui possède une variable statique chargée de vérifier l'enregistrement de notre VirtualPathProvider. Voici le code du HttpModule:

    public class WCFVPPRegModule: IHttpModule
     {

         static bool wcfProviderInitialized = false;

         static object locker = new object();

         public void Init(HttpApplication context)

         {

             if (!wcfProviderInitialized)

             {

                 lock (locker)

                 {

                     if (!wcfProviderInitialized)

                     {

                         WCFVirtualPathProvider wcfVPP = new WCFVirtualPathProvider();

                         HostingEnvironment.RegisterVirtualPathProvider(wcfVPP);

                         wcfProviderInitialized = true;

                     }

                 }

             }

         }

     }

Une fois que nos classes sont prêtes nous devons les mettre dans le GAC (dans notre cas nous allons les mettre dans un seul module dénommé "WCFSupport"), puis nous modifions le fichier web.config pour rajouter le HttpModule qui a son tour va référencer le VirtualPathProvider.

  <add 

     name="WCFVPPRegModule" 

    type="WCFSupport.WCFVPPRegModule, WCFSupport, Version=1.0.0.0, Culture=neutral,PublicKeyToken=d4f7bd9e55b39661" 

  />

Pour les utilisateurs de Windows Sever 2008: Dans IIS7 Manager cliquez sur la configuration d'authentification ("authentication settings") du site sharePoint ciblé, et activez l'authentification anonyme "anonymous authentication". Ceci permettra l'accès annonyme aux service sans corrompre la sécuité du site sharePoint.

Maintenant tout est prêt pour l'utilisation de WCF sous SharePoint pour vous en assurer dirigez vous, avec votre navigateur web, à l'adresse de votre service et si vous obtenez une page similaire a l'image ci-dessous c'est que tout est en règle:

13149583wq4.png (27.7 KB) Ahmed CHAABOUNI, 11/26/2009 06:22 AM

Also available in: HTML TXT