0

I'm creating an API that is primarily accessed by JavaScript clients, so every action returns a Json result regardless of if there is an error or not. That way, the client can handle gracefully whatever comes back, whether it is in the XHR from a 500 error or the return data payload with a 200 response. My code (which worked fine in MVC 2) usually goes a little something like this:

    [HttpPost]
    public ActionResult EditName(string Name, string Id)
    {
        try
        {
            // some code here

            Response.StatusCode = 200;
            return Json(new APIResult(true, Name), JsonRequestBehavior.AllowGet);
        }
        catch (Exception ex)
        {
            Response.StatusCode = 500;
            Response.StatusDescription = ex.UnRoll();
            return Json(new APIResult(false, ex.UnRoll()), JsonRequestBehavior.AllowGet);
        }
    }

The APIResult object and .UnRoll() methods are structures I've created to facilitate consistent results. Anyway, the problem happens in MVC 3 RC1 when an exception is handled. Because the StatusCode is set to 500, that ASP.NET handler does something and now, in Fiddler, I can see the response is:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<title>500 - Internal server error.</title>
<style type="text/css">
<!--
body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-    serif;background:#EEEEEE;}
fieldset{padding:0 15px 10px 15px;} 
h1{font-size:2.4em;margin:0;color:#FFF;}
h2{font-size:1.7em;margin:0;color:#CC0000;} 
h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;} 
#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS", Verdana, sans-serif;color:#FFF;background-color:#555555;}
#content{margin:0 0 0 2%;position:relative;}
.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;}
-->
</style>
</head>
<body>
<div id="header"><h1>Server Error</h1></div>
<div id="content">
 <div class="content-container"><fieldset>
  <h2>500 - Internal server error.</h2>
  <h3>There is a problem with the resource you are looking for, and it cannot be displayed.</h3>
 </fieldset></div>
</div>
</body>
</html>

The only way I can get it to return the proper JSON object is to replace the Response.StatusCode = 500; with Response.StatusCode = 200; which isn't really what I want to do, because then it is never handled as a true error by the XMLHttpRequest object on the client.

Can anybody point me to what changed or what I might need to do differently now?

Thanks!

pnuts
  • 58,317
  • 11
  • 87
  • 139
Jorin
  • 1,652
  • 1
  • 19
  • 25

1 Answers1

0

Thanks, BuildStarted, that should definitely work. For others who run into this issue, it apparently is not specific to ASP.NET MVC 3 RC1 (though I'm not entirely sure why it didn't affect my 2.0 applications). It apparently has something to do with IIS 7, and some Googling led me to another StackOverflow question (IIS7 Overrides customErrors when setting Response.StatusCode?) that has the Response.TrySkipIisCustomErrors = true; suggestion as well as another (and the one I ultimately went with since it didn't require me to edit every method) where you just add an httpErrors key to the system.webServer section of the Web.config file to override the default IIS error behavior.

Community
  • 1
  • 1
Jorin
  • 1,652
  • 1
  • 19
  • 25