How to set HTTP status code from ASP.NET MVC 3?

C#.Netasp.net Mvc-3

C# Problem Overview


We're using OpenWeb js libraries on the frontend, and they have a need for the .NET middle tier to send them a specific HTTP header status code when certain types of errors occur. I tried to achieve that by doing this:

public ActionResult TestError(string id) // id = error code
{
    Request.Headers.Add("Status Code", id);
    Response.AddHeader("Status Code", id);
    var error = new Error();
    error.ErrorID = 123;
    error.Level = 2;
    error.Message = "You broke the Internet!";

    return Json(error, JsonRequestBehavior.AllowGet);
}

It kind of halfway worked. See screenshot: http status code

Notice I achieved the Status Code of 400 in the Response Header, but I really need the 400 in the Request Header. Instead, I get "200 OK". How can I achieve this?

My URL structure for making the call is simple: /Main/TestError/400

C# Solutions


Solution 1 - C#

There is extended discussion at https://stackoverflow.com/q/499817/1210520

What you want to do is set Response.StatusCode instead of adding a Header.

public ActionResult TestError(string id) // id = error code
{
    Response.StatusCode = 400; // Replace .AddHeader
    var error = new Error();  // Create class Error() w/ prop
    error.ErrorID = 123;
    error.Level = 2;
    error.Message = "You broke the Internet!";

    return Json(error, JsonRequestBehavior.AllowGet);
}

Solution 2 - C#

If all you want to return is the error code, you could do the following:

public ActionResult TestError(string id) // id = error code 
{ 
      return new HttpStatusCodeResult(id, "You broke the Internet!");
}

Reference: MSDN article on Mvc.HttpStatusCodeResult.

Otherwise, if you want to return other information use

Response.StatusCode = id

instead of

Response.AddHeader("Status Code", id); 

Solution 3 - C#

If you can't get your json result into your view, try to add this :

Response.TrySkipIisCustomErrors = true;

Before this :

Response.StatusCode = 400;

More details on this post : https://stackoverflow.com/a/37313866/9223103

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionHerrimanCoderView Question on Stackoverflow
Solution 1 - C#Steve CzettyView Answer on Stackoverflow
Solution 2 - C#Nick JonesView Answer on Stackoverflow
Solution 3 - C#Ludo.CView Answer on Stackoverflow