none
IHttpHandler & IIS 7

    Question

  • Bonjour,

    J'ai développé une Classe en C# pour la réalisation d'un WebService.

    public class CLMHandler : IHttpHandler

    A la base je l'utilisais dans une Application Web, aucun problème de fonctionnement.

    Mais on m'a conseillé de juste en faire une classe et ensuite via un Handler dans IIS de gérer tout ça. Je suis d'accord sur le principe, mais pour la mise en place ...

    Donc dans mon répertoire wwwroot j'ai créé un dossier CLMHandler contenant un répertoire bin avec ma .dll

    C:\inetpub\wwwroot\CLMHandler\Bin

    J'utilise IIS7, dans celui-ci j'essaye d'ajouter un Handler via Handler Mappings, Add Script Map, Add Module Mapping, .. mais pas moyen de l'utiliser ...

    J'ai quand même un message d'alerte dans IIS qui me signale :

    The application is in an application pool that is running in Classic mode, so you can manage ISAPI extensions and native modules that are mapped to paths. You must manage managed handlers (system.web/httpHandlers) directly in the configuration file.

    Mais même en générant mon fichier web.config manuellement ça ne fonctionne pas :

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <system.webServer>
            <handlers>
                <add name="CLMHandler" path="*.clm" verb="*" type="CLMHandler" resourceType="Unspecified" requireAccess="Execute" allowPathInfo="true"/>
            </handlers>
        </system.webServer>
    </configuration>
    

    Si vous avez une idée sur comment relier ma Classe a un Handler dans IIS7 ?

    Merci pour votre aide,

    Youri

    mardi 26 mars 2013 14:36

Toutes les réponses

  • Bonjour,

    Comme il est écrit dans le warning, si vous utilisez le mode "Classic" de IIS, vous devez configurez votre handler dans la balise system.web/httpHandlers (vous ne pouvez pas utiliser la console IIS pour çà).

    L'autre solution est de configurer le pool d'application de tel manière à exécuter votre site web en mode "Integrated". En mode "Integrated", vous pouvez utiliser la console IIS pour configurer votre HttpHandler.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    mardi 26 mars 2013 17:20
    Modérateur
  • J'ai adapté mon fichier Web.config :

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <system.web>
            <httpHandlers>
                <add verb="*" path="*.clm" type="SyncHandler" />
            </httpHandlers>
        </system.web>
    </configuration>

    Mais j'obtiens toujours un 404 - File or directory not found.

    Pour le 2e point je n'ai pas vraiment de site web, juste une classe :

    public class SyncHandler : IHttpHandler

    Mon répertoire :
    C:\inetpub\wwwroot\CLMHandler\Bin

    Contient seulement ma DLL dans le Bin et le fichier Web.config.


    mercredi 27 mars 2013 12:30
  • Bonjour,

    Vous utilisez votre HttpHandler en mode Classic, il faut donc le déclarer aussi au niveau de IIS dans la rubrique "Handler Mappings" afin qu'il puisse exécuter ASP .NET lorsqu'un client contact une URL avec *.clm.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    mercredi 27 mars 2013 13:29
    Modérateur
  • Là je ne comprends plus ... si je fais ce que vous me dites IIS adapte mon fichier Web.config :

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <system.web>
            <httpHandlers>
                <add verb="*" path="*.clm" type="CLMHandler.SyncHandler, CLMHandler" />
            </httpHandlers>
        </system.web>
        <system.webServer>
            <handlers>
                <add name="CLMHandler" path="*.clm" verb="*" modules="IsapiModule" scriptProcessor="C:\inetpub\wwwroot\CLMHandler\Bin\CLMHandler.dll" resourceType="Unspecified" preCondition="bitness32" />
            </handlers>
        </system.webServer>
    </configuration>

    Je suis passé par Handler Mappings -> Add Script Map

    

    Donc je dois écrire mon fichier Web.config à la main et quand j'ajoute un Handler via IIS il ajoute des lignes.

    mercredi 27 mars 2013 13:47
  • Bonjour,

    Si vous êtes en mode intégré, la configuration du handler est mélangé au niveau IIS et ASP .NET (system.webServer/handlers) uniquement.
    Si vous êtes en mode classic, vous devez configurer ASP .NET et IIS (system.webServer/handlers et system.web/httpHandlers).

    Configurez votre handler au niveau IIS de cette manière (c'est juste pour dire à IIS de passer la requête *.clm au moteur ASP .NET) :

    <system.webServer>
           
    <handlers>
    <add name="CLMHandler" verb="*" path="*.clm" Modules="IsapiModule" scriptProcessor="C:Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="File" />

    </handlers>

    </system.webServer>

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    mercredi 27 mars 2013 14:45
    Modérateur
  • Ok donc en fait c'est ce que j'avais compris :)

    Donc au final j'ai essayé en changeant l'Application Pool, j'ai eu une erreur 500.
    Dans ce cas là je n'avais que system.webServer et handlers dans ma config.

    Ensuite j'ai essayé en mode classic donc avec system.webServer et system.web
    Et avec un lien vers la dll de l'IsapiModule.
    J'ai eu une erreur 404.

    En fait je ne vois pas comment ma classe (dll dans le répertoire .bin) pourrait être utilisée ?
    Sachant qu'au final je n'ai que 2 fichiers : la dll et le web.config.

    Au niveau du type je dois mettre : CLMHandler qui correspond au fichier /bin/CLMHandler.dll
    Ou alors le nom de ma classe ? SyncHandler

    public class SyncHandler : IHttpHandler

    Merci d'avance pour votre aide.

    mercredi 27 mars 2013 14:59
  • Bonjour,

    Le nom dans l'attribut "name" est un nom qui vous permet d'identifier le handler en cas d'erreur. Vous pouvez donc mettre ce que vous voulez.

    Question stupide, avez vous crée un site web au niveau de IIS ?
    Essayez dans un premier temps de mettre une page Default.aspx qui contient juste :

    <%= System.String.Concat("Ceci est un", "test !") %>

    Et au niveau de votre navigateur, vous accédez à la page http://..../default.aspx

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    jeudi 28 mars 2013 08:04
    Modérateur
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement,

    Aurel


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    vendredi 29 mars 2013 07:45
    Propriétaire
  • Bonjour,

    Désolé de répondre si tardivement, mais je n'avais plus accès au Serveur ...

    Donc j'ai ajouté un Default.aspx à la racine de mon dossier.

    Quand je veux exécuter le WS en local j'obtiens :

    HTTP Error 500.24 - Internal Server Error

    An ASP.NET setting has been detected that does not apply in Integrated managed pipeline mode.

    Et si je veux afficher le Default.aspx même erreur.

    Voilà mon fichier Web.config actuel :

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    	<system.web>
    		<compilation debug="true" targetFramework="4.0" />
    	</system.web>
    	<system.webServer>
    		<handlers>
            		<add name="SyncHandler" path="*.clm" verb="*" type="CLMHandler.SyncHandler" resourceType="Unspecified" requireAccess="Execute" allowPathInfo="true" />
    		</handlers>
    	</system.webServer>
    </configuration>

    mardi 2 avril 2013 08:03
  • Bonjour

    Ajoutez dans le Web.config

    <configuration>
        <system.webServer>
            <validation validateIntegratedModeConfiguration="false"/>
        </system.webServer>
    </configuration>
    Cordialement,

    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.


    mardi 2 avril 2013 11:55
    Propriétaire
  • Oui dans ce cas je n'ai plus de message d'erreur, mais j'ai l'impression que mon Web Service ne fonctionne pas, je vais re-tester.

    ---

    Donc je confirme, j'ai bien masqué le message d'erreur mais le WS ne fonctionne.

        public class CLMHandler : IHttpHandler
        {
    
            public void ProcessRequest(HttpContext context)
            {
    
                System.IO.StreamWriter test = new System.IO.StreamWriter(@"C:\inetpub\wwwroot\CLMIntegration\Test.txt", true);
                test.WriteLine("Test ok at : " + System.DateTime.Now.ToString() + " !");
                test.Close();
    Je demande juste de créer un fichier Test et rien ne se passe.

    mardi 2 avril 2013 12:03
  • Bonjour,

    Que voulez vous dire par ça ne fonctionne pas ? Il y a un message d'erreur ? Rien ne se produit ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    jeudi 4 avril 2013 22:18
    Modérateur
  • Rien ne se produit, je suppose donc qu'il ne rentre pas dans le WS.
    lundi 8 avril 2013 06:49