This error is common when a previously working web app has been migrated to another server or a cloud hosted environment, and it is now showing the HTTP 404 (Not Found) error. To figure out the root cause and solution, let’s take a look at how the web app was configured initially. We will then take a look at the solution.
HTTP Handlers Configuration
When we look at the web.config settings we can find this entry:
<add verb="*" path="myhandler.axd" type="MyHandler"/>
This setting indicates that there is an HTTP handler defined by the type MyHandler. It also tells IIS to allow all requests (verbs = GET, POST etc.) with the route myhandler.axd as this handler should manage the requests. This is important because this also works as a mime type setting, so there is no need to add a mime type for this file extension on IIS. It is important to notice that this setting only works for IIS 5, 6 and IIS7 Classic Mode.
If we migrate the app to a hosting service that has IIS7 (*Note that you can even notice this problem running on IIS7 express if you upgrade Visual Studio), we can probably recreate the 404 error.
There are two solutions to this problem:
- Use IIS7 Classic Mode
- Update the Web.config for IIS7 Support
Use IIS7 Classic Mode
If access to IIS is available, we can just change application pool Managed Pipeline Mode property to Classic, and the handler should be invoked properly. This can also be done for IIS Express by looking at the project properties - Manage Pipeline Mode setting.
Updating Web.config for IIS7 Support
In the case of cloud hosting, we need to make the change in the web.config by adding a new configuration section for HTTP handlers (*Note: This is used for IIS7 and future version). Let’s take a look at how that should look:
<add name="myhandler" verb="*" path="myhandler.axd" type="ozkary.MyHandler" preCondition="integratedMode"/>
This setting indicates that we have a handler that should manage the requests in integrated mode. This is how HTTP handlers are configured when running on IIS7. If we deploy again and load the site, we should no longer see the 404 error.
We should notice that these settings can co-exist in the web.config, but only one will be loaded which is dependent on your IIS environment. This approach can let us develop on previous version of IIS and target more recent version on our deployments.