Exemplo n.º 1
0
 public void OnAuthorization(ActionContext filterContext)
 {
     if (filterContext.Session.TagBag.Name == null)
     {
         // 未设置昵称的将抛出异常给客户端
         throw new Exception("请设置昵称后再聊天 ..");
     }
 }
        /// <summary>
        /// 生成Api行为的调用参数
        /// </summary> 
        /// <param name="context">上下文</param>        
        /// <exception cref="SerializerException"></exception>
        /// <returns></returns>
        public static object[] GetApiActionParameters(ActionContext context)
        {
            var body = context.Packet.body as JObject;
            if (body == null || body.IsArray == false)
            {
                throw new ArgumentException("body参数必须为数组");
            }

            if (body.Length != context.Action.ParameterTypes.Length)
            {
                throw new ArgumentException("body参数数量不正确");
            }

            var parameters = new object[body.Length];
            for (var i = 0; i < body.Length; i++)
            {
                var bodyParameter = body[i];
                var parameterType = context.Action.ParameterTypes[i];
                parameters[i] = JObject.Cast(bodyParameter, parameterType);
            }
            return parameters;
        }
Exemplo n.º 3
0
        /// <summary>
        /// 处理Api行为执行过程中产生的异常
        /// </summary>
        /// <param name="actionContext">上下文</param>
        /// <param name="actionfilters">过滤器</param>
        /// <param name="exception">异常项</param>
        private void ProcessExecutingException(ActionContext actionContext, IEnumerable<IFilter> actionfilters, Exception exception)
        {
            var exceptionContext = new ExceptionContext(actionContext, new ApiExecuteException(actionContext, exception));
            FastWebSocketCommon.SetRemoteException(this.Server.JsonSerializer, exceptionContext);
            this.ExecExceptionFilters(actionfilters, exceptionContext);

            if (exceptionContext.ExceptionHandled == false)
            {
                throw exception;
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// 调用自身实现的Api行为
        /// 将返回值发送给客户端        
        /// </summary>       
        /// <param name="actionContext">上下文</param>       
        /// <param name="filters">过滤器</param>
        /// <exception cref="SerializerException"></exception>
        private void ExecuteAction(ActionContext actionContext, IEnumerable<IFilter> filters)
        {
            var parameters = FastWebSocketCommon.GetApiActionParameters(actionContext);
            actionContext.Action.ParameterValues = parameters;

            // 执行Filter
            this.ExecFiltersBeforeAction(filters, actionContext);

            var returnValue = actionContext.Action.Execute(this, parameters);

            // 执行Filter
            this.ExecFiltersAfterAction(filters, actionContext);

            // 返回数据
            if (actionContext.Action.IsVoidReturn == false && actionContext.Session.IsConnected)
            {
                var packet = actionContext.Packet;
                packet.body = returnValue;
                var packetJson = this.Server.JsonSerializer.Serialize(packet);
                actionContext.Session.SendText(packetJson);
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// 在Api行为前 执行过滤器
        /// </summary>       
        /// <param name="actionFilters">Api行为过滤器</param>
        /// <param name="actionContext">上下文</param>   
        private void ExecFiltersBeforeAction(IEnumerable<IFilter> actionFilters, ActionContext actionContext)
        {
            // OnAuthorization
            foreach (var globalFilter in this.Server.GlobalFilter.AuthorizationFilters)
            {
                globalFilter.OnAuthorization(actionContext);
            }
            ((IAuthorizationFilter)this).OnAuthorization(actionContext);
            foreach (var filter in actionFilters)
            {
                var authorizationFilter = filter as IAuthorizationFilter;
                if (authorizationFilter != null)
                {
                    authorizationFilter.OnAuthorization(actionContext);
                }
            }

            // OnExecuting
            foreach (var globalFilter in this.Server.GlobalFilter.ActionFilters)
            {
                globalFilter.OnExecuting(actionContext);
            }

            ((IActionFilter)this).OnExecuting(actionContext);

            foreach (var filter in actionFilters)
            {
                var actionFilter = filter as IActionFilter;
                if (actionFilter != null)
                {
                    actionFilter.OnExecuting(actionContext);
                }
            }
        }
Exemplo n.º 6
0
        /// <summary>
        /// 在Api行为后执行过滤器
        /// </summary>       
        /// <param name="actionFilters">Api行为过滤器</param>
        /// <param name="actionContext">上下文</param>       
        private void ExecFiltersAfterAction(IEnumerable<IFilter> actionFilters, ActionContext actionContext)
        {
            // 全局过滤器
            foreach (var globalFilter in this.Server.GlobalFilter.ActionFilters)
            {
                globalFilter.OnExecuted(actionContext);
            }

            // 自身过滤器
            ((IActionFilter)this).OnExecuted(actionContext);

            // 特性过滤器
            foreach (var filter in actionFilters)
            {
                var actionFilter = filter as IActionFilter;
                if (actionFilter != null)
                {
                    actionFilter.OnExecuted(actionContext);
                }
            }
        }
Exemplo n.º 7
0
 /// <summary>
 /// 在执行Api行为前触发       
 /// </summary>
 /// <param name="filterContext">上下文</param>       
 /// <returns></returns>
 protected virtual void OnExecuting(ActionContext filterContext)
 {
 }
Exemplo n.º 8
0
 /// <summary>
 /// 授权时触发       
 /// </summary>
 /// <param name="filterContext">上下文</param>       
 /// <returns></returns>
 protected virtual void OnAuthorization(ActionContext filterContext)
 {
 }
Exemplo n.º 9
0
        /// <summary>
        /// 执行Api行为
        /// </summary>   
        /// <param name="actionContext">上下文</param>      
        void IFastApiService.Execute(ActionContext actionContext)
        {
            this.CurrentContext = actionContext;
            var filters = this.Server.FilterAttributeProvider.GetActionFilters(actionContext.Action);

            try
            {
                this.ExecuteAction(actionContext, filters);
            }
            catch (AggregateException exception)
            {
                foreach (var inner in exception.InnerExceptions)
                {
                    this.ProcessExecutingException(actionContext, filters, inner);
                }
            }
            catch (Exception exception)
            {
                this.ProcessExecutingException(actionContext, filters, exception);
            }
            finally
            {
                this.CurrentContext = null;
            }
        }
Exemplo n.º 10
0
 /// <summary>
 /// 授权时触发       
 /// </summary>
 /// <param name="filterContext">上下文</param>       
 /// <returns></returns>
 void IAuthorizationFilter.OnAuthorization(ActionContext filterContext)
 {
     this.OnAuthorization(filterContext);
 }
Exemplo n.º 11
0
 /// <summary>
 /// 在执行Api行为前触发       
 /// </summary>
 /// <param name="filterContext">上下文</param>       
 /// <returns></returns>
 void IActionFilter.OnExecuting(ActionContext filterContext)
 {
     this.OnExecuting(filterContext);
 }
 public void OnExecuting(ActionContext filterContext)
 {
     var log = string.Format("Time:{0} Client:{1} Action:{2} Message:{3}", DateTime.Now.ToString("mm:ss"), filterContext.Session, filterContext.Action, this.message);
     Console.WriteLine(log);
 }
 public void OnExecuted(ActionContext filterContext)
 {
 }
Exemplo n.º 14
0
 /// <summary>
 /// Api执行异常
 /// </summary>
 /// <param name="actionContext">Api行为上下文</param>
 /// <param name="innerException">内部异常</param>
 public ApiExecuteException(ActionContext actionContext, Exception innerException)
     : base(innerException.Message, innerException)
 {
     this.ActionContext = actionContext;
 }