We noticed in our error logs that we were getting quite a few of these good old errors:
"Cannot redirect after HTTP headers have been sent."
This wasn’t affecting our system from a usability point of view, but it’s irritating nonetheless.
Anyway, the cause of the error was the following code in the OnActionExecuting
override of a custom ActionFilterAttribute
:
HttpContext.Current.Response.Redirect("our url", true)
Looks fine, right?
The error here is that within action filter attributes, you don’t know what other code is being executed
in the request pipeline – in our case we had a BaseController adding caching headers in the OnResultExecuting
override.
The correct way to do this is to set the result of the filterContext object – this gets dealt with immediately and the error goes away. The correct code is:
filterContext.Result = new RedirectResult("our url");
Pretty trivial, I know, but I Googled this and found very little out there that actually describes this error and the solution.