JohnIdol
JohnIdol

Reputation: 50097

Problem mapping HttpHandler --> HTTP Error 404 Not Found

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>

Upvotes: 35

Views: 46356

Answers (9)

Harv
Harv

Reputation: 555

This seems to be an edge case, but I had a customer where our httpHandler used in our application did not work on any of their servers. The handler pointed to an .ashx page and it was called from JavaScript.

The handler mapping showed up in IIS, the handler factory was there, but I would get a 404 when the browser requested the ashx page associated with the handler. After many different attempts to fix we finally browsed to the file in IIS on the server and it specifically showed a 404.7 being returned with this message.

•Request filtering is configured for the Web server and the file extension for this request is explicitly denied.

•Verify the configuration/system.webServer/security/requestFiltering/fileExtensions settings in applicationhost.config and web.config.

If you get this then Request Filtering is enabled for the .ashx extension at either your app or site level. Go to the Request Filtering option in IIS at both your site and app level and verify that the extension is not blocked. There are two different ways Request Filtering can be configured.

The default seems to be that it explicitly blocks only file extensions that are configured in the list (blacklist). The other way it can be configured is that only files specifically configured as allowed in the list are let through (whitelist). This second option is how the customer had configured all of their Windows Servers by default and it turns out that the .ashx file extension was not in the list of allowed extensions.

Upvotes: 1

hestellezg
hestellezg

Reputation: 3711

This is the first thread that appears when I look for a verb that responds with a 404. In my case the solution was a configuration of VS

Tools > Options > Web projects > [x] Use 64 bit version

Sorry, my VS is in spanish

Upvotes: 0

Octobadger
Octobadger

Reputation: 143

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!

Upvotes: 2

CARLOS HERNANDEZ
CARLOS HERNANDEZ

Reputation: 51

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>

Upvotes: 5

James
James

Reputation: 2841

It is also possible to experience this error if you have set up the handler for 32 bit, but you are running in 64 bit (or vice versa). It's easy to set up both and have all the bases covered.

Note "preCondition", and "scriptProcessor" differences.

<handlers>
    <add name="MyHandler_32bit" verb="*" path="*MyHandler.hndlr" preCondition="bitness32" type="MyAssembly.MyAssemblyHandler, MyAssembly" validate="false" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" />
    <add name="MyHandler_64bit" verb="*" path="*MyHandler.hndlr" preCondition="bitness64" type="MyAssembly.MyAssemblyHandler, MyAssembly" validate="false" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" />
</handlers>

Upvotes: 2

InbetweenWeekends
InbetweenWeekends

Reputation: 1414

Hopefully my solution will help others. On a server move from IIS6 to 7.5, both .Net 4.0 Integrated, I had a Captcha control that quit working. It turns out that removing this attribute preCondition="integratedMode,runtimeVersionv2.0" from the <add> node in <system.webserver><handlers> resolved the issue.

Upvotes: 1

CResults
CResults

Reputation: 5105

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 :)

Upvotes: 11

Wallace Breza
Wallace Breza

Reputation: 4948

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.

Upvotes: 4

Coding Flow
Coding Flow

Reputation: 21881

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>

Upvotes: 30

Related Questions