如何在指定控制器上禁用全局配置的httpErrors自定义错误规则
解决方案
方案1:通过web.config的location节点配置(推荐,无需修改业务代码)
你可以保留原有的全局httpErrors配置不变,只需要在web.config的<configuration>根节点下新增针对指定控制器路径的单独配置即可:
<configuration> <!-- 原有全局配置保持不变 --> <system.webServer> <httpErrors errorMode="Custom" existingResponse="Auto"> <clear /> <error statusCode="400" responseMode="ExecuteURL" path="/Core/Code/400" /> <error statusCode="403" responseMode="ExecuteURL" path="/Core/Code/403" /> <error statusCode="404" responseMode="ExecuteURL" path="/Core/Code/404" /> <error statusCode="500" responseMode="ExecuteURL" path="/Core/Code/500" /> </httpErrors> </system.webServer> <!-- 新增针对指定路径的配置,比如控制器路由为/Api/*就填path="Api" --> <location path="你要排除的控制器路由前缀"> <system.webServer> <httpErrors errorMode="Detailed" existingResponse="PassThrough" overrideMode="Allow" /> </system.webServer> </location> </configuration>
该配置会让匹配path规则的所有请求,直接返回服务端生成的原始响应,不触发全局自定义错误页规则,其余路径仍然走全局配置。
方案2:通过自定义过滤器实现代码层面的控制
如果你的控制器路由是动态的,或者需要更灵活的控制逻辑,可以通过给指定控制器添加过滤器的方式实现:
首先自定义跳过IIS错误页的过滤器:
ASP.NET Framework版本
public class SkipIisCustomErrorsAttribute : ActionFilterAttribute { public override void OnResultExecuted(ResultExecutedContext filterContext) { if (filterContext.HttpContext.Response.StatusCode >= 400) { filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; } base.OnResultExecuted(filterContext); } }
ASP.NET Core版本
public class SkipIisCustomErrorsAttribute : ActionFilterAttribute { public override void OnResultExecuted(ResultExecutedContext context) { if (context.HttpContext.Response.StatusCode >= 400) { context.HttpContext.Response.TrySkipIisCustomErrors = true; } base.OnResultExecuted(context); } }
直接把这个特性打在需要跳过配置的控制器上即可:
[SkipIisCustomErrors] public class YourSpecialController : Controller { // 控制器逻辑 }
这种方式不会影响全局的自定义错误页逻辑,只有加了该特性的控制器/动作返回错误状态码时,才会跳过IIS的httpErrors规则。
注意事项
- 方案1的path参数支持填写具体的控制器名、目录名,也支持通配符匹配,按需调整即可
- 若使用方案2,不需要修改全局的existingResponse配置,保持原有
existingResponse="Auto"即可正常生效
内容的提问来源于stack exchange,提问作者Mico
相关产品推荐
相关产品推荐

