/// <summary> /// 异常处理 /// </summary> /// <param name="actionContext">当前异常</param> public override void OnActionExecuting(HttpActionContext actionContext) { base.OnActionExecuting(actionContext); var returnType = "application/json"; var fileType = "multipart/form-data"; HttpRequestMessage request = actionContext.Request; request.Headers.Accept.Clear(); request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(returnType)); request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(fileType)); request.Headers.AcceptCharset.Add(new StringWithQualityHeaderValue("zh-cn", 0.5)); request.Headers.AcceptCharset.Add(new StringWithQualityHeaderValue("en-us", 0.5)); request.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip")); request.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate")); System.Collections.ObjectModel.Collection <CookieHeaderValue> cookies = actionContext.Request.Headers.GetCookies("SessionID"); ApiBaseController bc = (ApiBaseController)actionContext.ControllerContext.Controller; //初始化Cookie和Session以及当前登录用户 InitiSession(cookies, actionContext, bc); //检查当前Action是否需要身份验证和授权才能执行 CheckLoginAndOperation(actionContext, bc); }
/// <summary> /// 拼装异常信息与环境信息 /// </summary> /// <param name="context">当前上下文</param> /// <param name="ex">异常</param> /// <returns>异常信息与环境信息文本</returns> private static string GetExceptionMessage(HttpActionExecutedContext context, Exception ex) { string paramData = Evt.Framework.Common.JsonUtil.Serialize(context.ActionContext.ActionArguments); ApiBaseController bc = (ApiBaseController)context.ActionContext.ControllerContext.Controller; string sessionID = bc.Session.SessionID; return(ex.ToString() + "\r\n ParamData:" + paramData + " SessionID:" + sessionID + "\r\n URL:" + context.Request.RequestUri + "\r\n\r\n"); }
/// <summary> /// 检查当前Action是否需要身份验证和授权才能执行 /// </summary> /// <param name="actionContext">HttpActionContext</param> /// <param name="bc">BaseController</param> private void CheckLoginAndOperation(HttpActionContext actionContext, ApiBaseController bc) { var attributes = actionContext.ActionDescriptor.GetCustomAttributes <NonAuthorizeAttribute>(); //验证是否需要登录 if (attributes != null && attributes.Count > 0) { return; } //验证是否已经登录 bool isLogin = true; if (bc.Session.ContainsKey(ConfigUtil.SystemUserSessionKey)) { var currUser = bc.Session[ConfigUtil.SystemUserSessionKey] as LoginInfo; isLogin = currUser != null; } else { isLogin = false; } if (!isLogin && !actionContext.Request.RequestUri.LocalPath.ToLower().Equals("/shop/dologout")) { var noSessionMsg = "会话超时,请重新登录!"; var current = ServiceContext.Current; if (current != null && current.RequestTerminal != null && !string.IsNullOrWhiteSpace(current.RequestTerminal.ClientToken) && current.RequestTerminal.ClientToken != "null") { bc.SingleLoginOn(current.RequestTerminal.ClientToken); var currUser = SingleInstance <ShopBLL> .Instance.DoLogin(null, current.RequestTerminal.ClientToken); if (currUser != null) { var loginInfo = new LoginInfo() { UserId = currUser.ShopId, Mobile = currUser.ShopAccount, AccessToken = currUser.AccessToken }; bc.Session[ConfigUtil.SystemUserSessionKey] = loginInfo; } else { throw new Evt.Framework.Common.AuthenticationException(noSessionMsg); } } else { throw new Evt.Framework.Common.AuthenticationException(noSessionMsg); } } }
/// <summary> /// 异常处理 /// </summary> /// <param name="actionExecutedContext">异常类型</param> public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { ApiBaseController bc = (ApiBaseController)actionExecutedContext.ActionContext.ControllerContext.Controller; string actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName ?? string.Empty; if (actionExecutedContext.Response != null) { actionExecutedContext.Response.Headers.AddCookies(new CookieHeaderValue[] { new CookieHeaderValue("SessionID", bc.Session.SessionID) { Path = "/" } }); //如果请求不带版本号,则添加响应头以指示浏览器不缓存当前请求结果 if (actionExecutedContext.ActionContext.Request.Properties.ContainsKey("v")) { actionExecutedContext.ActionContext.Response.Headers.Add("Pragma", "no-cache"); actionExecutedContext.ActionContext.Response.Headers.Add("Expires", "0"); } } base.OnActionExecuted(actionExecutedContext); }
/// <summary> /// 初始化Session和当前用户 /// </summary> /// <param name="cookies">Collection</param> /// <param name="bc">BaseController</param> private void InitiSession(Collection <CookieHeaderValue> cookies, HttpActionContext actionContext, ApiBaseController bc) { if (cookies == null || cookies.Count == 0) { bc.Session = SessionManager.CreateSession(); } else { string sessionID = string.Empty; foreach (CookieState cookieState in cookies[0].Cookies) { if (cookieState.Name == "SessionID") { sessionID = cookieState.Value; break; } } Session session = SessionManager.GetSession(sessionID); if (session == null) { bc.Session = SessionManager.CreateSession(); } else { bc.Session = session; } } //获取客户端信息 var clientModel = new RequestClientInfoModel(); if (bc.Session.ContainsKey(ConfigUtil.SystemTerminalSessionKey)) { var clientSeesion = bc.Session[ConfigUtil.SystemTerminalSessionKey]; if (clientSeesion != null) { clientModel = bc.Session[ConfigUtil.SystemTerminalSessionKey] as RequestClientInfoModel; } } else { clientModel = GetClientInfo(actionContext.Request); clientModel.ClientIP = NetUtil.Ip; bc.Session[ConfigUtil.SystemTerminalSessionKey] = clientModel; } //设置Service中的ContextUser ServiceContext.Current.ContextUser = new SysServericeContext(bc.Session.SessionID); //设置Service中的RequestTerminal ServiceContext.Current.RequestTerminal = new PrdRequestTerminal(bc.Session.SessionID); }