// Actual Responder
        public ActionResult Index(string version, string modelname, string parameters)
        {
            string data = string.Empty;

            // Key Api Key First
            string key = Request.QueryString["key"];
            ApiResponse <object> FailedKeyResponse = new ApiResponse <object>();

            if (!AuthenticateKey(key, FailedKeyResponse))
            {
                data = MerchantTribe.Web.Json.ObjectToJson(FailedKeyResponse);
            }
            else
            {
                // Create Handler
                IRestHandler handler = RestHandlerFactory.Instantiate(version, modelname, MTApp);

                // Read Posted JSON
                string postedString = string.Empty;
                Stream inputStream  = Request.InputStream;
                if (inputStream != null)
                {
                    StreamReader rdr = new StreamReader(inputStream);
                    postedString = rdr.ReadToEnd();
                }

                switch (Request.HttpMethod.ToUpperInvariant())
                {
                case "GET":
                    data = handler.GetAction(parameters, Request.QueryString);
                    break;

                case "POST":
                    data = handler.PostAction(parameters, Request.QueryString, postedString);
                    break;

                case "PUT":
                    data = handler.PutAction(parameters, Request.QueryString, postedString);
                    break;

                case "DELETE":
                    data = handler.DeleteAction(parameters, Request.QueryString, postedString);
                    break;
                }
            }

            // Return Result (or text formatted result)
            if (Request.QueryString["apiformat"] == "text")
            {
                return(new RawResult(data, "text/html"));
            }
            return(new PreJsonResult(data));
        }