Neil
Neil

Reputation: 5239

HttpError iis config throws exception when default path is added

I have this config which works and redirects the following errors correctly

<httpErrors errorMode="Custom" 
        existingResponse="Replace" 
        defaultResponseMode="ExecuteURL" >
  <remove statusCode="403" />
  <remove statusCode="404" />
  <remove statusCode="500" />
  <error statusCode="403" responseMode="ExecuteURL" path="/Error/AccessDenied" />
  <error statusCode="404" responseMode="ExecuteURL" path="/Error/PageNotFound" />
  <error statusCode="500" responseMode="ExecuteURL" path="/Error/ApplicationError" />
</httpErrors>

But when I add the following default path to try to add a catch all

<httpErrors errorMode="Custom" 
        existingResponse="Replace" 
        defaultResponseMode="ExecuteURL" 
        defaultPath="/Error/ApplicationError">

The server throws a web.config error

HTTP Error 500.19 - Internal Server Error
The requested page cannot be accessed because the related configuration data for the page is invalid.
Module     CustomErrorModule

Now this directly contradicts the documentation on msdn

Any help would be greatly appreciated!!

Upvotes: 13

Views: 6833

Answers (5)

Thibault Deflers
Thibault Deflers

Reputation: 21

If you need to do this programmatically, you can use something like

using (ServerManager serverManager = new ServerManager())
{
    Configuration hostConfig = serverManager.GetApplicationHostConfiguration();
    ConfigurationSection confSection = hostConfig.GetSection(sectionName);
    confSection.SetMetadata("lockAttributes", "");

    serverManager.CommitChanges();
}

and use system.webServer/httpErrors as section name. Attribute defaultPath is still locked in IIS10.

Upvotes: 0

Jono
Jono

Reputation: 4086

This is becuase IIS by default (Ive just discovered this with IIS 10) at a server level locks defaultPath.

The error is saying some parent web.config attribute has been locked so you're not allowed to overwrite it.

The way to change this is to

  1. Open IIS
  2. Select the top level node in the tree (Your server/computer name most likely)
  3. Click the 'Configuration Editor' icon in the last row.
  4. Enter 'system.webServer/httpErrors' into the section dropdown at the top Configuration Editor -> httpErrors -> defaultPath attribute
  5. Right click the defaultPath
  6. Go to the 'defaultPath' attribute > sub menu
  7. Click Unlock attribute
  8. Click Apply Changes in the top right

I'd generally recommend against this though, as you'll have to do this on every server you deploy the site to. (and I'm also not sure how something like Azure Web apps that dont give you this level of access handle it)

Upvotes: 2

Mohamed Mansour
Mohamed Mansour

Reputation: 40199

You cannot override httpErrors "defaultPath" attribute in IISExpress because of applicationhost.config locked that attribute:

<httpErrors lockAttributes="allowAbsolutePathsWhenDelegated,defaultPath">

You can read more about it here: https://support.microsoft.com/en-us/kb/942055 This problem can occur:

when the specified portion of the IIS configuration file is locked at a higher configuration level. To resolve this problem, unlock the specified section, or do not use it at that level. For more information on configuration locking, see How to Use Locking in IIS 7.0 Configuration.

Upvotes: 7

Vlad Rudenko
Vlad Rudenko

Reputation: 2869

Using of defaultPath attribute prevents using of path attribute in your error nodes. So below configuration will work (but of course it will show the same error page for all HTTP errors defined here):

<httpErrors errorMode="Custom" existingResponse="Replace"
  defaultResponseMode="ExecuteURL" defaultPath="/Error/ApplicationError">
  <remove statusCode="403" />
  <remove statusCode="404" />
  <remove statusCode="500" />
  <error statusCode="403" responseMode="ExecuteURL" />
  <error statusCode="404" responseMode="ExecuteURL" />
  <error statusCode="500" responseMode="ExecuteURL" />
</httpErrors>

Related doc: https://msdn.microsoft.com/en-us/library/ms690576(v=vs.90).aspx

Upvotes: 6

Ivan Doroshenko
Ivan Doroshenko

Reputation: 942

Try defaultPath="~/Error/ApplicationError" with ~.

Upvotes: -2

Related Questions