public virtual void ProcessRequest(HttpContextBase context) { ApiRequest request = null; MatchedRoute route = null; ApiResponse response = new ApiResponse(); Type[] knownTypes = new Type[0]; if (RequestPassesSslCheck(context)) { try { route = this.GetRequestRoute(context); request = this.GetRequestReader(context, route, readers).ReadRequest(context, route.RouteType, response); // Permitted? IPermission failedOn; if (context.EnsurePermitted(route.RouteType, out failedOn)) { knownTypes = route.RouteType.GetCustomAttributes(typeof(KnownTypeAttribute), true) .Cast<KnownTypeAttribute>() .Select(a => a.Type) .ToArray(); ApiResult valid = request.Validate(); if (valid.Success) { // Do it. ApiActionResult result = request.Do(); response.Success = result.Success; response.Reason = result.Reason; response.Value = result.Value; } else { response.Success = false; response.Reason = valid.Reason; } } else { response.Success = false; response.Reason = "Access denied."; response.Allowed = false; response.StatusCode = 401; } } catch (InvalidRequestTypeException ex) { response.Success = false; response.Reason = ex.Message; response.StatusCode = 400; } catch (Exception ex) { response.Success = false; response.StatusCode = 500; if (context.Request.IsLocal) { response.Reason = String.Concat(ex.Message, "\n", ex.StackTrace); } else { response.Reason = "An internal server error occurred while processing your request."; } } } else { response.Success = false; response.Reason = "A secure connection is required when making this request."; response.StatusCode = 403; } string id = context.Request.Headers["X-Request-Id"]; id = !String.IsNullOrEmpty(id) ? id : "0"; context.Response.AppendHeader("X-Response-Id", id); context.Response.StatusCode = response.StatusCode; this.GetResponseWriter(context, route, writers).WriteResponse(context, request, response, knownTypes); }