Cómo obtener información de excepción al llamar al servicio web JSON

En .NET 3.5, tenía el siguiente código:

[WebService(Namespace = "http://kitchenpc.com/schemas/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class KitchenPC : System.Web.Services.WebService
{
   [WebMethod]
   public LogonResult Logon(string username, string password)
   {
      //If username and password are not valid...
      throw new InvalidUsernameOrPasswordException();
   }
}

Cuando lo llamaría, si pasaba un nombre de usuario y contraseña no válidos, elInvalidUsernameOrPasswordException sería lanzado y podría atrapar la excepción en Javascript mirandoerror.get_exceptionType(). Esto se debe a que el servicio web serializaría la información de excepción en JSON.

Sin embargo, una vez que actualicé a .NET 4.5, esto se rompió. Ahora, cuando paso un nombre de usuario y contraseña no válidos, obtengo la respuesta HTTP:

HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.5
jsonerror: true
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Sat, 24 Nov 2012 22:42:33 GMT
Content-Length: 91

{"Message":"There was an error processing the request.","StackTrace":"","ExceptionType":""}

Básicamente, el tipo de excepción se pierde y se reemplaza con un mensaje de error genérico.

¿Qué causó que este comportamiento cambiara, y todavía hay una manera de devolver información de excepción en JSON? Casi toda mi API está diseñada para confiar en este comportamiento.

Respuestas a la pregunta(2)

Su respuesta a la pregunta