Problem mapping HttpHandler --> HTTP Error 404 Not Found

43,413

Solution 1

Are you using IIS7, if so is the application pool running in classic or pipelined mode? If it is IIS7 in pipelined mode then the handler reference needs to go into the following section

<system.webServer>
    <handlers>
    </handlers>
<system.webServer>

rather than in the following section.

<system.web>
    <httpHandlers>
    </httpHandlers>
</system.web>

Solution 2

Just as a guide for those stuck with this problem I found the crucial attribute to be..

resourceType="Unspecified"

I originally followed a Microsoft example to set this up and they had it as

resourceType="File"

which just kept giving me 404 errors. My HTTPHandler is returning graphics.

Hope this helps :)

Solution 3

i am using IIS7, the solution is:

in section

<system.web>
    <httpHandlers>
        <add verb="*" path="*.ashx" type="CVOS.MyDocumentHandler"/>
    </httpHandlers>
<system.web>

and section

<system.webServer>
    <handlers>
       <add name="pdfHandler" verb="*" path="*.ashx"   type="CVOS.MyDocumentHandler" /> 
    </handlers>
</system.webServer>

Solution 4

What is the extension of your handler? If you are using a custom extension like .hndlr you may also need to add a ScriptMap in IIS and point it to the ASP.NET runtime so that IIS can forward the request to the correct processor.


  1. In IIS7 go to your website
  2. Under the IIS group go to Handler Mappings
  3. Under Actions click Add Script Map
  4. Set Request Path to *.hndlr
  5. Set Path to the ASP.NET runtime (%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll) or whatever version you are running.

Then in your web.config you will need to register the handler in the appropriate section as described in the other answer.

Solution 5

None of the previous answers worked for me.
I'm using IIS 8.5, .Net v4.0, Integrated, and was still getting a 404 with the following handler config:

<system.webServer>
    <handlers>
       <add name="testEmail" path="*.em" verb="*" type="MyApp.testRazorEmailHandler, MyApp" resourceType="Unspecified" requireAccess="Script" />
    </handlers>
</system.webServer>


I enabled tracing and found the following :

116. -HANDLER_CHANGED 

    OldHandlerName              testEmail 
    NewHandlerName              System.Web.Mvc.MvcHandler 
    NewHandlerModules           ManagedPipelineHandler 
    NewHandlerScriptProcessor
    NewHandlerType              System.Web.Mvc.MvcHandler, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 


As you can see it looks like it had correctly picked up the request using my custom HttpHandler testEmail but MVC had stolen it.
I opened my route definitions in RouteConfig.cs and found that adding:

   routes.IgnoreRoute("{resource}.em");

I got it to ignore requests meant for my Handler.
Hope this helps someone - I was tearing my hair out!

Share:
43,413
JohnIdol
Author by

JohnIdol

The world will be mine but then I'll be killed by my own AI. Or by a giant simulated C. elegans out of the OpenWorm project. You can follow me on twitter.

Updated on February 08, 2022

Comments

  • JohnIdol
    JohnIdol over 2 years

    I am having problems trying to map an HttpHandler in the web.config.

    This is the relevant config bit:

    <httpHandlers>
      <add verb="*" path="*.hndlr" type="MyAssembly.MyHandler, MyAssembly" validate="false" />
    </httpHandlers>
    

    When I navigate to http://localhost/myApp/whatever.hndlr I am getting a server error 404 (not found).

    It's the 1st time I am hooking up an HttpHandler so I might be missing something - any help appreciated!

    UPDATE:

    I managed to get it working using both answers so far - who's able to explain why it works gets the answer marked!

    This is my config (won't work if you don't have both - I am running IIS7 in classic mode)

    System.web:

    <httpHandlers>
        <add verb="*" path="*MyHandler.hndlr" type="MyAssembly.MyAssemblyHandler, MyAssembly" validate="false"/>
    </httpHandlers>
    

    System.webserver:

    <handlers>
        <add name="MyHandler" verb="*" path="*MyHandler.hndlr" type="MyAssembly.MyAssemblyHandler, MyAssembly" validate="false" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script"/>
    </handlers>
    
  • JohnIdol
    JohnIdol about 14 years
    tried (had to add name="MyHandler" to the attributes) - looks promising but getting a different error now --> HTTP Error 500.21 - Internal Server Error Handler "MyHandler" has a bad module "ManagedPipelineHandler" in its module list
  • JohnIdol
    JohnIdol about 14 years
    to answer your other question I am running in classic mode (not pipelined) - which explains why I am getting the error described in the comment above :)
  • JohnIdol
    JohnIdol about 14 years
    Yes the solution was a bit of a mixture between the two answers - I am about to post the solution and who's able to better explain what the heck is going on gets the points! :)
  • David Christopher Reynolds
    David Christopher Reynolds over 5 years
    This has saved my bacon. Thanks ever so much.