Deploiement de service WCF (.svc) dans IIS et "Allow this precompiled site to be updatable"
Lorsque vous déployer un service WCF sur IIS, vous devez forcément passer par un fichier .svc. Ce fichier permet d'indiquer à IIS la classe implémentant le service et ainsi faire le lien entre IIS et le runtime WCF de .net. Ce fichier est généralement composé d'une seule ligne possédant une directive de page ServiceHost
Par exemple si vous avez un service contenu dans la classe "Sample.Upload.Services.Upload" alors le fichier svc contiendra seulement cette ligne :
<%@ ServiceHost Service="Sample.Upload.Services.Upload" %>
Bien sur, il est également nécessaire d'avoir toute la config verbeuse habituelle de WCF dans le web.config. A noter que cette directive possède également l'attribut Factory qui permet de personaliser la création du ServiceHost, par défaut la classe utilisé est ServiceHostFactory.
Heberger le fichier .svc dans un site web existant ?
Ce fichier .svc est donc tout à fait semblable aux autres fichiers d'un site web ASP.net. Si vous avez un site web qui expose des données via WCF, il est tentant de mettre ce fichier .svc au sein du même projet Visual Studio.
C'est en effet une idée logique. Mais attention lors de la publication, si vous passez par le menu "publier" du site web, vous ne devez pas décocher la case "Allow this precompiled site to be updatable". Sinon Visual Studio, en fait l'outil aspnet_compiler.exe utilisé en interne par Visual Studio, va précompiler le fichier .svc, c'est à dire remplacer son contenu par "This is a marker file generated by the precompilation tool, and should not be deleted!" et mettre le code dans le dossier bin. Malheureusement un fichier svc ne se comporte pas comme un fichier ASP.net classique, il faut impérativement que le fichier contienne la directive de page, sinon le service ne peut pas fonctionner.
Quelles sont les impactes de ce problème ? Lorsque vous accéderez au fichier .svc publié sur IIS, vous aurez une erreur 404 ou une page blanche. Si vous obtenez un "404 : The page cannot be found" en voulant accéder à un service WCF publié dans un fichier .svc, vérifier que vous n'avez pas précompilé le fichier.
Est-ce un bug de Visual Studio ? Oui ! j'ai effectué une recherche sur connect (le site de report de bug) et j'ai trouvé cette entrée : WCF service deployment problem when "allow this precompiled site to be updatable" is not selected
Pour le contourner :
- soit vous laissez coché la case "Allow this precompiled site to be updatable", ce que je ne vous conseille pas pour des raisons de perfs et sécurité du code.
- soit après publication vous copier le fichier .svc original non "précompilé", encore faut-il penser à le faire :-)
- Soit vous n'incluez pas le fichier .svc dans votre projet web au niveau de Visual Studio, la ligne de code du fichier se trouvera alors seulement sur le serveur
- [non testé] soit vous n'utilisez pas le publish, mais un web deployment project avec des directives de post publication afin de copier le bon fichier .svc