ASP.NET MVC, Permanent Redirects and HTTP 301 Moved Permanently

This one stumped me for an embarrassingly long time.  I have several pages that I am in the process of moving permanently to a new domain.  The site is written using ASP.NET MVC and I wanted my controller to return a 301 Moved Permanently status (along with the location header) if the page in question has been moved.

Originally I was just trying to set the status and header manually.  Not a good idea, and ASP.NET MVC makes it difficult.  That was my first clue I was not heading in the right direction.  My next thought was to create and return a new class HttpMovedResult derived from ActionResult.

This worked, and was remarkably simple and easy to use.

But it still felt wrong – returning a specific status code was easy but I couldn’t set the required Location header.  Try as I might though, I couldn’t find a class that would return a redirect status and the Location header for me.

Of course, I was so focused on classes, I neglected the controller methods.  Sure enough, the Controller class has several methods for dealing with redirects, including RedirectPermanent(url), which will return a 301 Moved Permanently status code, along with the appropriate Location header.  If you just need a temporary redirect, Redirect(url) will do the same thing with a 302 Found status code.