框架技术细节

1.全局异常判别

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
    public class EwHandleErrorAttribute : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            if (ICTConfiguration.Debug)
            {
                base.OnException(filterContext);
                return;
            }

            if (filterContext.ExceptionHandled)
            {
                return;
            }
            if (filterContext.HttpContext.Response.IsRequestBeingRedirected)
            {
                return;
            }
            var httpCode = new HttpException(null, filterContext.Exception).GetHttpCode();
            if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
            {
                return;
            }
            if (new HttpException(null, filterContext.Exception).GetHttpCode() != 500)
            {
                return;
            }
            ExceptionHelper.LogException(filterContext.Exception, HttpContext.Current);
            bool isAjaxCall = string.Equals("XMLHttpRequest", filterContext.HttpContext.Request.Headers["x-requested-with"],
                                       StringComparison.OrdinalIgnoreCase);
            if (isAjaxCall)
            {
                string message = filterContext.Exception.Message;
                if (filterContext.Exception is HttpRequestValidationException)
                {
                    message = "包含非法字符";
                }

                filterContext.Result = new JsonResult()
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new
                    {
                        succeed = false,
                        ret = httpCode,
                        msg = message
                    }
                };
            }
            else
            {
                var controllerName = (string)filterContext.RouteData.Values["controller"];
                var actionName = (string)filterContext.RouteData.Values["action"];
                var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
                filterContext.Result = new ViewResult()
                 {
                     ViewName = View,
                     MasterName = Master,
                     ViewData = new ViewDataDictionary(model),
                     TempData = filterContext.Controller.TempData
                 };
                filterContext.HttpContext.Response.Redirect("/500.html");
            }
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
            filterContext.HttpContext.Server.ClearError();
        }
    }

2.判别当前注册用户是否加入企业(包括是否登录):过滤器

    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
    public class JoinEnterpriseAttribute : TokenAuthorizeAttribute
    {
        public WorkContext WorkContext
        {
            get
            {
                var workContext = (WorkContext)System.Web.HttpContext.Current.Items["__current__workcontext"];
                if (workContext == null)
                {
                    workContext = new WorkContext();
                    System.Web.HttpContext.Current.Items["__current__workcontext"] = workContext;
                }
                return workContext;
            }
        }

        public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);
            if (!filterContext.HttpContext.Response.IsRequestBeingRedirected)
            {
                var entAuths = (EntAuthAttribute[])filterContext.ActionDescriptor.GetCustomAttributes(typeof(EntAuthAttribute), false);
                var centAuths = filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(EntAuthAttribute), true);
                if (entAuths.Length == 0 && centAuths.Length == 0)
                {
                    if (WorkContext != null && WorkContext.UserInfo != null && (WorkContext.CompanyId == 0 || string.IsNullOrWhiteSpace(WorkContext.UserInfo.Name)))
                    {
                        filterContext.HttpContext.Response.Redirect("/auth", true);
                    }
                }
            }
        }

    }
 [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
    public class TokenAuthorizeAttribute : AuthorizeAttribute
    {
        public WorkContext WorkContext
        {
            get
            {
                var workContext = (WorkContext)System.Web.HttpContext.Current.Items["__current__workcontext"];
                if (workContext == null)
                {
                    workContext = new WorkContext();
                    System.Web.HttpContext.Current.Items["__current__workcontext"] = workContext;
                }
                return workContext;
            }
        }

        public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
        {
            if (WorkContext == null || WorkContext.UserInfo == null || WorkContext.UserInfo.UserID == 0)
            {
                if (filterContext == null)
                {
                    throw new ArgumentNullException("filterContext");
                }
                if (filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    filterContext.HttpContext.Response.StatusCode = 401;
                    string strUrl = ConfigurationManager.AppSettings.Get("PassportDoMain");
                    if (filterContext.HttpContext.Request.Url != null)
                    {
                        string path = filterContext.HttpContext.Request.Url.ParserUrl();
                        strUrl += "?returnUrl=" + path;
                    }
                    filterContext.Result = Ajax.Json(new { succeed = false, ret = 401, url = strUrl }, JsonRequestBehavior.AllowGet);
                    return;
                }
                if (filterContext.HttpContext.Request.Url != null)
                {
                    string path = filterContext.HttpContext.Request.Url.ParserUrl();
                    string strUrl = ConfigurationManager.AppSettings.Get("PassportDoMain") + "?returnUrl={0}";
                    filterContext.HttpContext.Response.Redirect(string.Format(strUrl, HttpUtility.UrlEncode(path)), true);
                    filterContext.HttpContext.Response.End();
                }
            }
        }

    }
时间: 2024-11-09 02:18:47

框架技术细节的相关文章

集合框架浅析

一 Collection Framwork Diagram 二 重要接口 类解析  1 Collection(元素无序)    数组具有良好的随机访问性能,但数组中元素类型单一,一旦声明其空间大小固定.Collection弥补了数组空间不可扩充的缺陷,既可以加入任意类型的对象,空间也可以自由分配.经典谚语"Collection就像一个筐,任何类型的对象都可以放入,而且元素可以重复".  2 List(元素有序) 1 ArrayList 与LinkedList List是Collecti

angular 使用概术

框架技术细节说明 must 该文档详细说明了基于Angular的机制及关键技术. 目录: - 路由机制 - 通过路由来切分页面模块 - Lazyload机制 - 指令 - 程序bootstrap - 数据绑定 - filters - 何时编写自定义指令 - controller之间的通信 - 依赖注入 - 统一的http请求拦截器 - 根据不同的页面,显示不一样的头部菜单选中 - 如何进行国际化 - 如何进行表单校验 - 动画 - 测试 路由机制 路由机制是指页面是如何根据url跳转的.如,访问

一个入门rpc框架的学习

一个入门rpc框架的学习 参考 huangyong-rpc 轻量级分布式RPC框架 该程序是一个短连接的rpc实现 简介 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC, 它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC.会两方面会直接影响 RPC 的性能,一是传输方式,二是序列化. 众所

iOS开源照片浏览器框架SGPhotoBrowser的设计与实现

简介 近日在制作一个开源加密相册时附带着设计了一个照片浏览器,在进一步优化后发布到了GitHub供大家使用,该框架虽然没有MWPhotoBrowser那么强大,但是使用起来更为方便,操作更符合常规相册习惯,自定义和修改源码也十分简单. 本文主要介绍这个照片浏览器框架的技术要点,如果要深入研究和使用,可以在下面的链接中下载源码. 如果你对这个框架有兴趣,可以点击这里前去GitHub下载源码,欢迎Star与指出不足. 效果图 缩略图预览,点击缩略图进入原图浏览,点击底部工具栏可以进入编辑模式. 批量

【转】轻量级分布式 RPC 框架

第一步:编写服务接口 第二步:编写服务接口的实现类 第三步:配置服务端 第四步:启动服务器并发布服务 第五步:实现服务注册 第六步:实现 RPC 服务器 第七步:配置客户端 第八步:实现服务发现 第九步:实现 RPC 代理 第十步:发送 RPC 请求 总结 附录:Maven 依赖 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 H

如何自己构建一个小型的Zoomeye----从技术细节探讨到实现

 0.概述 Zoomeye是个网络空间的搜索引擎,它不同于传统意义上的搜索引擎,而是一种可以搜索网络组件和网络设备的搜索引擎. 这种以各大组件指纹作为识别基础的数据平台,更多的是为了使得安全研究人员更好地评估漏洞的影响范围与其中隐含的数据模式. 1.架构分析 这是从网上搜索到的一张Zoomeye的后端架构图,主要分为调度框架.ES存储.UI呈现等模块.对于一次漏洞的评估,启动调度框架分配域名或者IP列表给扫描节点,节点完成任务后执行回调,做出自动化的效果其实也不是很难,从网上找个开源消息队列

Google C++单元测试框架---GTest的Sample1和编写单元测试的步骤

如果你还没有搭建gtest框架,可以参考我之前的博客:http://www.cnblogs.com/jycboy/p/6001153.html.. 1.The first sample: sample1 你把github上的项目导来之后,github地址:https://github.com/google/googletest,在目录:..(你的目录)\googletest-master\googletest\samples是你的samples文件夹. 在VS中创建项目:GtestSamples

日志收集框架 Exceptionless

日志收集框架 Exceptionless 前言 从去年就答应过Eric(Exceptionless的作者之一),在中国会帮助给 Exceptionless 做推广,但是由于各种原因一直没有做这件事情,在此对Eric表示歉意.:) Exceptionless 简介 Exceptionless 是一个开源的实时的日志收集框架,它可以应用在基于 ASP.NET,ASP.NET Core,Web Api,Web Forms,WPF,Console,MVC 等技术栈的应用程序中,并且提供了Rest接口可以

轻量级分布式 RPC 框架

原文出处: 黄勇 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC,它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC.会两方面会直接影响 RPC 的性能,一是传输方式,二是序列化. 众所周知,TCP 是传输层协议,HTTP 是应用层协议,而传输层较应用层更加底层,在数据传输方面,越底层越快,