Ejemplo n.º 1
0
        public void RunRoule(HttpListenerContext context, RouleMap roule, Interceptor interceptor_)
        {
            if (context == null)
            {
                Log.Print("链接还未建立");
                return;
            }
            try
            {
                string path = context.Request.RawUrl.Trim();
                path = Uri.UnescapeDataString(path);
                //  Log.Print(path);
                string url        = path;
                string methodname = "";
                string url_suffix = "";
                if (!check_directory_permission(path))
                {
                    Error404(context, url);
                    return;
                }

                if (isMimeType(path) == null)
                {
                    string[] m = path.Split('/');

                    RouleItem action = null;
                    action = roule.getRoule(path, ref methodname, ref url_suffix);

                    if (action != null)
                    {
                        if (methodname.ToLower().Equals("index") && url[url.Length - 1] != '/')
                        {
                            context.Response.StatusCode       = 301;
                            context.Response.RedirectLocation = url + "/";
                            context.Response.AddHeader("Cache-Control", "no-cache,no-store");
                            Write(context, "");
                            return;
                        }

                        HttpSession Session       = null;
                        bool        isInterceptor = false;
                        if (Config.Session_open)
                        {
                            Session = new HttpSession(context);
                        }
                        if (action.isInterceptor)
                        {
                            object     Interceptor_obj    = assembly.CreateInstance(interceptor_.ToString()); // 创建类的实例
                            Type       Interceptor_type   = Interceptor_obj.GetType();
                            MethodInfo Interceptor_method = Interceptor_type.GetMethod("Init", new Type[] { typeof(HttpListenerContext), typeof(HttpSession) });
                            object[]   parameters1        = new object[] { context, Session };
                            Interceptor_method.Invoke(Interceptor_obj, parameters1);
                            Interceptor_method = Interceptor_type.GetMethod("isInterceptor");
                            isInterceptor      = (bool)Interceptor_method.Invoke(Interceptor_obj, null);
                        }

                        if (!isInterceptor)
                        {
                            object     obj         = assembly.CreateInstance(action.action); // 创建类的实例
                            Type       type        = obj.GetType();
                            MethodInfo method_main = type.GetMethod(methodname);
                            if (method_main == null)
                            {
                                method_main = type.GetMethod(methodname.ToLower());
                            }
                            MethodInfo method     = type.GetMethod("Init", new Type[] { typeof(HttpListenerContext), typeof(HttpSession), typeof(string), typeof(string), typeof(Compress) });
                            object[]   parameters = new object[] { context, Session, action.view, url_suffix, compress };

                            try
                            {
                                method.Invoke(obj, parameters);
                            }
                            catch (Exception e)
                            {
                                Log.Print("[Init]方法执行异常:" + path + "|" + e.Message + "|" + method.ToString());
                                Error404(context, url);
                            }

                            if (method_main != null)
                            {
                                object[] parameters1 = null;
                                try
                                {
                                    parameters1 = formatParam(context, method_main, url_suffix);
                                }
                                catch (Exception e)
                                {
                                    Log.Print("[formatParam]异常:" + path + "|" + e.Message);
                                    parameters1 = null;
                                }
                                try
                                {
                                    method_main.Invoke(obj, parameters1);
                                    return;
                                }
                                catch (Exception e)
                                {
                                    Log.Print("方法执行异常:" + path + "|" + e.Message + "|" + method_main.ToString());
                                }


                                if (context.Response.ContentLength64 == 0)
                                {
                                    Error404(context, url);
                                }
                            }
                            else
                            {
                                Error404(context, url);
                            }
                        }
                    }
                    else
                    {
                        Error404(context, url);
                    }
                }
                else
                {
                    if (Config.open_cache && !Config.open_debug)
                    {
                        DateTime n             = DateTime.Now;
                        string   Modified_time = n.ToUniversalTime().ToString("r");
                        string   Expires_time  = n.AddHours(24).ToUniversalTime().ToString("r");
                        context.Response.AddHeader("Cache-Control", "max-age=" + Config.cache_max_age);
                        context.Response.AddHeader("Pragma", "Pragma");
                        context.Response.AddHeader("Last-Modified", Modified_time);
                        context.Response.AddHeader("Expires", Expires_time);
                    }
                    else
                    {
                        context.Response.AddHeader("Cache-Control", "no-cache,no-store");
                    }
                    string path2 = path;
                    if (!string.IsNullOrEmpty(Config.AppName))
                    {
                        string tmp = "/" + Config.AppName + "/";
                        if (!path.Substring(0, tmp.Length).Equals(tmp) && !path.Equals("/favicon.ico"))
                        {
                            Error404(context, url);
                            return;
                        }
                        else
                        {
                            path2 = path.Replace(tmp, "/");
                        }
                    }
                    string root = "";
                    if (!Config.WebRoot.Equals(""))
                    {
                        root = "/" + Config.WebRoot;
                    }

                    string htmlfile = System.IO.Directory.GetCurrentDirectory() + root + path2;
                    if (htmlfile.IndexOf('?') > -1)
                    {
                        htmlfile = htmlfile.Substring(0, htmlfile.IndexOf('?'));
                    }
                    if (File.Exists(htmlfile))
                    {
                        string extension = System.IO.Path.GetExtension(htmlfile).Replace(".", "");

                        byte[] data = File.ReadAllBytes(htmlfile);
                        string mime = getMimeType(extension);
                        context.Response.ContentType = mime;
                        context.Response.StatusCode  = 200;
                        WriteByte(context, data);
                    }
                    else
                    {
                        Error404(context, path);
                    }
                }
            }
            catch (Exception e)
            {
                Log.Print("路由方法[RunRoule]:" + e.Message);
                Error500(context, e.Message);
            }
        }
Ejemplo n.º 2
0
 public void Init(HttpListenerContext context, HttpSession Session_)
 {
     Session  = Session_;
     Request  = context.Request;
     Response = context.Response;
 }