Reputation: 5239
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
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
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
'Configuration Editor'
icon in the last row.'system.webServer/httpErrors'
into the section dropdown at the top
defaultPath
'defaultPath' attribute >
sub menuUnlock attribute
Apply Changes
in the top rightI'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
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
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