Pregunta HttpHandler non viene eseguito

  • domingo, 06 de mayo de 2012 9:49
     
      Tiene código

    Ciao a tutti,

    sto provando per la prima volta a implementare un httphandler, come esempio vorrei intercettare tutti i file con estensione .prova

    Il mio ambiente di sviluppo è VS2010, Framework 4.0 senza IIS installato (utilizzo l'Asp.Net Development Server)

    Seguendo i vari esempi trovati in rete, ho creato l'httphanderl (in un WebSite) e l'ho posizionato nella cartella App_code:

    public class HandlErr : IHttpHandler {
      
        public void ProcessRequest (HttpContext context) {
            context.Response.ContentType = "text/plain";
            context.Response.Write("Hello World");
        }
    
        public bool IsReusable {
            get {
                return false;
            }
        }

    e lo inserisco nel web.config:

    <system.webServer>
        <handlers>
          <add name="HandlErr" verb="*" path="*.prova" type="HandlErr, App_Code"/>
        </handlers>
    </system.webServer>

    il problema è che, provando a effettuare una richiesta, non avviene nulla... Se metto un break point nella ProcessRequest, non si ferma...

    E' possibile che dipenda dal Asp.Net Development Server? Nel senso, è necessaria qualche altra operazione oltre a quelle che ho fatto?

    Grazie :)







    • Editado PowerLower domingo, 06 de mayo de 2012 9:51
    •  

Todas las respuestas

  • domingo, 06 de mayo de 2012 10:39
    Usuario que responde
     
      Tiene código

    La sezione system.webServer in cui hai configurato il tuo handler è gestita solo se utilizzi IIS 7.0 (o successivo) oppure IIS Express.

    Se, invece, usi l'ASP.NET Development Server, oppure pubblichi il sito su un IIS 6.0 (quindi su Windows Server 2003), per configurare l'handler devi inserire l'apposita sezione httpHandlers nella sezione system.web:

    <httpHandlers>      
      <add verb="*" path="*.prova" type="HandlErr, App_Code"/>
    </httpHandlers>


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • domingo, 06 de mayo de 2012 11:28
     
      Tiene código

    Grazie mille Marco, ora funziona!! :)

    Quindi nell'ambiente di sviluppo devo fare:

    <system.web>
    <compilation debug="true" targetFramework="4.0"/>
    <httpHandlers>
    <add verb="*" path="*.prova" type="HandlErr, App_Code"/>
    </httpHandlers>
    </system.web>

    Mentre in produzione (dove ho IIS 7.5) dovrò inserire la stessa direttiva:

    <add verb="*" path="*.prova" type="HandlErr, App_Code"/>

    ma all'interno dei tag <handlers></handlers> della sezione <system.webServer> giusto? Oppure la direttiva è diversa?

    Grazie ancora! :)



    • Editado PowerLower domingo, 06 de mayo de 2012 11:30
    •  
  • domingo, 06 de mayo de 2012 11:33
    Usuario que responde
     
     

    Sì, su IIS 7.5 devi inserire la sezione handlers in system.webServer esattamente come hai mostrato nel tuo primo post.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • domingo, 06 de mayo de 2012 11:48
     
      Tiene código

    Perfetto, nel ringraziarti ancora approfitto per un'ultima domanda, in realtà ciò che vorrei intercettare sono tutti i file che terminano con un punto (esempio: http://miosito.it/file. oppure http://miosito.it/cartella/file.. oppure http://miosito.it/cartella/cartella1/file... ) ma se provo a fare:

    <add verb="*" path="/*." type="HandlErr, App_Code"/>

    non funziona...

    Forse non si indica con /*. ma c'è una sintassi diversa?

    Grazie :)


  • domingo, 06 de mayo de 2012 11:51
    Usuario que responde
     
     
    Non credo che questo sia possibile...

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • domingo, 06 de mayo de 2012 11:54
     
     
    Acc... Quindi non c'è nessun modo di intercettare richieste di questo tipo? Anche usando altri metodi al posto di un httphandler...
  • domingo, 06 de mayo de 2012 11:55
    Usuario que responde
     
     
    Direi di no... D'altra parte, a cosa ti serve?

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • domingo, 06 de mayo de 2012 12:02
     
     

    Ti spiego, ho un sito web e all'interno del webmastertool visualizzo una serie di errori 404 di questa forma: miosito.it/pagina.. miosito.it/paginadue.. ecc... questo perchè Google indicizza questi link (non so perchè nè in che modo), per cui vorrei che, a fronte di queste richieste, non venga ritornato il classico errore 404 di iis ma una pagina di errore personalizzata.

    P.S. Ho fatto dei test in molti siti web e riescono a gestire questi tipi di richieste (compare una pagina personalizzata), a questo punto però non so come facciano...

  • domingo, 06 de mayo de 2012 12:07
    Usuario que responde
     
     
    Aspetta, ma se il tuo problema è mostrare una pagina di errore personalizzata, nel caso di pagina non trovata (404), non devi usare un HttpHandler, ma configurare la sezione customErrors nel file web.config: http://msdn.microsoft.com/it-it/library/h0hfz6fc.aspx.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • domingo, 06 de mayo de 2012 12:12
     
      Tiene código

    Ho già configurato le pagine di errore in questo modo:

    <remove statusCode="404" subStatusCode="-1" />
    <error statusCode="404" prefixLanguageFilePath="" path="/ErrorPage.aspx" responseMode="ExecuteURL" />
    ....
    <customErrors defaultRedirect="/ErrorPage.aspx" mode="RemoteOnly">
    <error statusCode="404" redirect="/ErrorPage.aspx" />  
    </customErrors>

    e riesco ad intercettare tutti gli errori 404 tranne però quelli in cui la richiesta termina con un punto e non riesco a capire perchè, ecco il motivo per cui avevo pensato di usare un httphandler :)


    • Editado PowerLower domingo, 06 de mayo de 2012 12:13
    •  
  • domingo, 06 de mayo de 2012 12:18
    Usuario que responde
     
     
    Credo che potresti usare un HttpModule in cui, per ogni richiesta, controlli se l'URL termina con il punto: in tal caso, effettui il redirect verso la pagina di errore.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • domingo, 06 de mayo de 2012 12:49
     
     
    Ci provo subito, grazie! :)
  • domingo, 06 de mayo de 2012 13:04
     
     
    Niente, non c'è da fare. Anche con un HttpModule, ogni volta che richiedo un url che termina con un punto, mi compare immediatamente l'errore 404 di iss non permettendomi di fare nulla, mi sa che ci rinuncio :(
  • domingo, 06 de mayo de 2012 13:06
    Usuario que responde
     
     
    Hai verificato che, inserendo un URL corretto, il modulo viene invocato, mentre con un indirizzo che finisce con il punto, ciò non accade?

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • domingo, 06 de mayo de 2012 13:21
     
     

    Sì, il modulo viene sempre invocato, tranne quando l'url termina con un punto...

    Mi viene da pensare che possa essere IIS che tratta in modo particolare gli url che terminano con un punto.

    • Editado PowerLower domingo, 06 de mayo de 2012 13:33
    •  
  • domingo, 06 de mayo de 2012 13:33
    Usuario que responde
     
     

    Resta da provare con l'URL Rewriting, ma non saprei in che modo... Onestamente, è la prima volta che sento qualcuno che vuole intercettare le richieste che terminano con il punto :-)


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • domingo, 06 de mayo de 2012 15:24
     
     
    • Editado PowerLower domingo, 06 de mayo de 2012 15:25
    •  
  • domingo, 06 de mayo de 2012 15:43
    Usuario que responde
     
     

    La discussione che hai segnalato parla di un problema lato client, ovvero quando si effettua una richiesta verso un URL che termina con il punto (utilizzando HttpWebRequest).

    Al contrario, a te invece serve gestire le richieste ricevute dal server (e quindi non richieste che fai tu, bensì richieste che provengono dall'esterno). Direi quindi che non è ciò che ti serve.

    Tuttavia, facendo qualche altra ricerca su Internet, sembra che questo problema sia un bug noto di .NET, che però non è mai stato risolto. Non credo quindi che ci sia molto da fare.

    Ad ogni modo, se devo essere sincero non ho capito perché hai bisogno di gestire le richieste che terminano il punto... Come mai ricevi richieste di questo tipo?

     

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • domingo, 06 de mayo de 2012 16:16
     
     
    Sembra che siano molti siti a ricevere richieste di questo tipo, forse un bug di Google (tanto per restare in tema di bug) che indicizza come fossero dei link le frasi che spesso nei siti vengono abbreviate coi puntini, qui per esempio un altro utente che segnala lo stesso problema.
    • Editado PowerLower domingo, 06 de mayo de 2012 16:17
    •  
  • domingo, 06 de mayo de 2012 16:22
    Usuario que responde
     
     

    Mi sembra molto difficile che Google possa indicizzare le frasi che terminano con i puntini... Comunque, se hai questo dubbio nei confronti del modo in cui Google indicizza i contenuti del tuo sito, ti consiglio di mandare una richiesta di supporto a Google stesso, così da fugare ogni dubbio.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • lunes, 21 de mayo de 2012 23:28
     
      Tiene código

    Rispolvero questo post poichè ho trovato una interessante impostazione del web.config dal simpatico nome che potrebbe essere utile alla causa:

    <httpRuntime relaxedUrlToFileSystemMapping="true" />

    ora infatti non ottengo più l'errore di default di IIS alla richiesta di url che terminano con un punto, anche se non riesco ancora ad intercettarli...



    • Editado PowerLower lunes, 21 de mayo de 2012 23:30
    •