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; }
/// <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; } }
/// <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); } }
/// <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); } } }
/// <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); } } }
/// <summary> /// 在执行Api行为前触发 /// </summary> /// <param name="filterContext">上下文</param> /// <returns></returns> protected virtual void OnExecuting(ActionContext filterContext) { }
/// <summary> /// 授权时触发 /// </summary> /// <param name="filterContext">上下文</param> /// <returns></returns> protected virtual void OnAuthorization(ActionContext filterContext) { }
/// <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; } }
/// <summary> /// 授权时触发 /// </summary> /// <param name="filterContext">上下文</param> /// <returns></returns> void IAuthorizationFilter.OnAuthorization(ActionContext filterContext) { this.OnAuthorization(filterContext); }
/// <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) { }
/// <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; }