コード例 #1
0
ファイル: Handler.cs プロジェクト: Jin-K/SimpleJsonRest
        public void ProcessRequest(System.Web.HttpContext context)
        {
            var url_part = GetUrl(context.Request.RawUrl);

            // Pour tests avec page html
            if (url_part.ToLower().EndsWith(".html") || url_part.ToLower().EndsWith(".htm"))
            {
                var files = System.IO.Directory.GetFiles(context.Server.MapPath("~"));
                for (var c = 0; c < files.Length; c++)
                {
                    var file = files[c].ToLower();
                    if (file.Contains(url_part.Substring(1)))
                    {
                        context.Response.ContentType = "text/html";
                        context.Response.Write(System.IO.File.ReadAllText(file));
                        context.Response.End();
                        break;
                    }
                }
            }

            var ip = context.Request.ServerVariables["REMOTE_ADDR"];

            Utils.Tracer.Log($" > > > > > > Start request || {ip} || path: {url_part} || --- {System.DateTime.Now} ---->");

            context.Response.Clear();

            object json_response = null;

            try {
                context.Response.ContentType = "application/json; charset=utf-8";

                foreach (var route in Router)
                {
                    if (route.Check(url_part))
                    {
                        Utils.Tracer.Log("route prise : " + route.Path);
                        json_response = route.Execute();
                        return;
                    }
                }

                // Si route pas trouvée
                json_response = new { error = "Unknown path" };
                context.Response.StatusCode = (int)System.Net.HttpStatusCode.NotFound;
            }
            catch (System.Exception e) {
                // TODO Complètement revoir la gestion des exceptions ... ==> FaultException, FaultException2 ? Pourquoi j'ai utilisé ces classes pourries ?
                string exceptionType = e.GetType().Name;
                switch (exceptionType)
                {
                case "FaultException":
                    FaultException _e = e as FaultException;
                    context.Response.StatusCode = (int)System.Net.HttpStatusCode.BadRequest;
                    json_response = new { error = _e.Message };
                    break;

                case "FaultException2":
                    HandlerException _e2 = e as HandlerException;
                    context.Response.StatusCode = (int)_e2.StatusCode;
                    json_response = new { error = _e2.Message };
                    break;

                case "TargetInvocationException": // exception coming from a reflected assembly method
                    context.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
                    json_response = new {
                        error = (e as System.Reflection.TargetInvocationException).InnerException.Message,
                        type  = exceptionType,
                        trace = (e as System.Reflection.TargetInvocationException).InnerException.StackTrace
                    };
                    break;

                default:
                    context.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
                    json_response = new {
                        error = e.Message,
                        type  = exceptionType,
                        trace = e.StackTrace
                    };
                    break;
                }

                Utils.Tracer.Log("IDPHandler.ProcessRequest " + e);
            }
            finally {
                Utils.Tracer.Log($" < < < < < < < End request || {ip} || path: {url_part} || --- {System.DateTime.Now} <----");

                /// If there is a response
                if (json_response != null)
                {
                    context.Reply(json_response);
                }
                /// If Route.Execute() returned null ==> Reject 401
                else
                {
                    context.Response.StatusCode = (int)System.Net.HttpStatusCode.Unauthorized;
                }

                /// Applies cross-domain http-header if needed
                if (
                    System.Web.Configuration.WebConfigurationManager.AppSettings["cross_domain"] != null &&
                    int.TryParse(System.Web.Configuration.WebConfigurationManager.AppSettings["cross_domain"], out int cross_domain) &&
                    cross_domain == 1
                    )
                {
                    context.Response.AppendHeader("Access-Control-Allow-Origin", "*");
                }

                /// End request traitement and flush
                context.Response.End();
            }
        }