public override void OnActionExecuting(ActionExecutingContext context) { return; base.OnActionExecuting(context); var headers = Request?.Headers?.ToList() .ToDictionary(k => k.Key.ToLower(), v => v.Value.ToArray()); var path = context.HttpContext.Request.Path.Value.Substring(1); var args = context.ActionArguments; var method = context.HttpContext.Request.Method; var scheme = context.HttpContext.Request.Scheme; var host = context.HttpContext.Request.Host.Value; var basePath = Url.Content("~"); var queryS = context.HttpContext.Request.Query.ToDictionary(k => k.Key, v => v.Value.ToArray()); var ip = context.HttpContext.Connection.RemoteIpAddress.ToString(); var lang = headers?.ContainsKey("lang") ?? false ? headers["lang"].FirstOrDefault() : string.Empty; var token = headers?.ContainsKey("key") ?? false ? headers["key"].FirstOrDefault() : string.Empty; UserTokenModel tokenInfo = null; if (!string.IsNullOrWhiteSpace(token)) { tokenInfo = _authenticateUtil.ValidateToken(token); } var bodyStr = string.Empty; if (context.HttpContext.Request.ContentLength != null) { //context.HttpContext.AllowSynchronousIO using var reader = new StreamReader(context.HttpContext.Request.Body, Encoding.UTF8, true, 1024, true); bodyStr = reader.ReadToEnd(); } _sendingModel = new QWebRequestMessage() { TraceId = context.HttpContext.TraceIdentifier, Scheme = scheme, Domain = host, BasePath = basePath, Url = path, IP = ip, HttpMethod = method, Headers = headers, Arguments = args, QueryStrings = queryS, Body = bodyStr, Lang = lang, //Token = token, //TokenInfo = tokenInfo }; }
protected override async Task ProcessSendMessage(QWebRequestMessage request) { try { //var wr = Activator.CreateInstance<TReceiver>(); var wr = IoC.Resolve <TReceiver>(); wr.Request = request; var fm = FindMethod(wr, request); if (fm.Item1 != (int)HttpStatusCode.OK) { return; } var authM = fm.Item3.GetCustomAttribute <QAuthAttribute>(false); var authC = fm.Item3.GetCustomAttribute <QAuthAttribute>(true); var anonymousM = fm.Item3.GetCustomAttribute <QAllowAnonymousAttribute>(false); //var anonymousC = fm.Item2.GetCustomAttribute<QAllowAnonymousAttribute>(true); if ((authM != null && !request.IsAuthenticated) || (authC != null && anonymousM == null && !request.IsAuthenticated)) { return; } if (!string.IsNullOrWhiteSpace(request.Lang)) { var cultureInfo = new CultureInfo(request.Lang); CultureInfo.CurrentCulture = cultureInfo; CultureInfo.CurrentUICulture = cultureInfo; } await(Task <QWebResponse>) fm.Item3.Invoke(wr, parameters: fm.Item4?.ToArray()); } catch //(Exception e) { // } }
private (int, string, MethodInfo, List <object>, string) FindMethod(TReceiver rcInstance, QWebRequestMessage request) { (int, string, MethodInfo, List <object>, string)res; try { var path = request.Url.ToLower().Split('/').Where(p => !string.IsNullOrWhiteSpace(p)).ToArray(); if (path.Length <= 1) { return((int)HttpStatusCode.NotFound, HttpStatusCode.NotFound.GetEnumName() + ", 002", null, null, HttpStatusCode.NotFound.GetEnumName() + ", 002"); } var tMethod = path[1]; var methods = rcInstance.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance); var cMethods = methods.Where(m => m.Name.ToLower() == tMethod).ToArray(); var cMethod = cMethods.FirstOrDefault(); if (cMethods.Length > 1) { Type attr; switch (request.HttpMethod.ToUpper()) { case "GET": attr = typeof(QGetAttribute); break; case "POST": attr = typeof(QPostAttribute); break; case "PUT": attr = typeof(QPutAttribute); break; case "PATCH": attr = typeof(QPatchAttribute); break; case "DELETE": attr = typeof(QDeleteAttribute); break; case "HEAD": attr = typeof(QHeadAttribute); break; case "OPTIONS": attr = typeof(QOptionsAttribute); break; default: attr = null; break; } MethodInfo me = null; if (attr != null) { me = cMethods.FirstOrDefault(m => m.GetCustomAttribute(attr) != null); } if (me == null) { me = cMethods.FirstOrDefault(m => m.GetCustomAttribute <QHttpMethodAttribute>(true) == null); } if (me != null) { cMethod = me; } } if (cMethod == null) { return((int)HttpStatusCode.NotFound, HttpStatusCode.NotFound.GetEnumName() + ", 003", null, null, HttpStatusCode.NotFound.GetEnumName() + ", 003"); } List <object> mParams = null; var cParam = cMethod.GetParameters(); if (cParam.Any()) { mParams = new List <object>(); var route = cMethod.GetCustomAttribute <QRouteAttribute>()?.Route?.ToLower() .Split('/') .Where(p => !string.IsNullOrWhiteSpace(p)) .ToArray(); foreach (var prm in cParam) { var prmName = prm.Name.ToLower(); object p = null; var qfb = prm.GetCustomAttribute <QFromBodyAttribute>(); if (qfb != null) { p = JsonConvert.DeserializeObject(request.Body.FromBytes(), prm.ParameterType); } var qfh = prm.GetCustomAttribute <QFromHeaderAttribute>(); if (p == null && qfh != null && request.Headers.ContainsKey(prmName)) { var v = request.Headers[prmName]; p = v.ConvertToType <string>(prm.ParameterType); } /*if (p == null && request.QueryStrings.ContainsKey(prmName)) * { * var v = request.QueryStrings[prmName]; * p = v.ConvertToType<string>(prm.ParameterType); * }*/ if (p == null && (route?.Any() ?? false)) { var rf = Array.IndexOf(route, prmName); if (rf >= 0 && path.Length > rf + 2) { p = path[rf + 2].ConvertToType <string>(prm.ParameterType); } } if (p == null && prm.HasDefaultValue) { p = prm.DefaultValue; } mParams.Add(p); } } res = ((int)HttpStatusCode.OK, "", cMethod, mParams, null); } catch (Exception e) { //#if DEBUG res = ((int)HttpStatusCode.InternalServerError, HttpStatusCode.InternalServerError.GetEnumName(), null, null, JsonConvert.SerializeObject(e)); /*#else * res = * ((int)GlobalStatusCode.InternalServerError, GlobalStatusCode.InternalServerError.GetEnumName(), null, null, * GlobalStatusCode.InternalServerError.GetEnumName()); #endif*/ } return(res); }
protected override async Task <QWebResponse> ProcessRequestMessage(QWebRequestMessage request) { QWebResponse res; try { //var wr = Activator.CreateInstance<TReceiver>(); var wr = IoC.Resolve <TReceiver>(); wr.Request = request; var fm = FindMethod(wr, request); if (fm.Item1 != (int)HttpStatusCode.OK) { return(new QWebResponse() { TraceId = request.TraceId, Status = fm.Item1, Response = JsonConvert.SerializeObject(fm.Item5) }); } var authM = fm.Item3.GetCustomAttribute <QAuthAttribute>(false); var authC = fm.Item3.GetCustomAttribute <QAuthAttribute>(true); var anonymousM = fm.Item3.GetCustomAttribute <QAllowAnonymousAttribute>(false); //var anonymousC = fm.Item2.GetCustomAttribute<QAllowAnonymousAttribute>(true); if ((authM != null && !request.IsAuthenticated) || (authC != null && anonymousM == null && !request.IsAuthenticated)) { return(new QWebResponse() { TraceId = request.TraceId, Status = (int)HttpStatusCode.Forbidden, Response = JsonConvert.SerializeObject(HttpStatusCode.Forbidden.GetEnumName()) }); } if (request.IsAuthenticated) { } if (!string.IsNullOrWhiteSpace(request.Lang)) { var cultureInfo = new CultureInfo(request.Lang); CultureInfo.CurrentCulture = cultureInfo; CultureInfo.CurrentUICulture = cultureInfo; } var methodRes = Globals.RunMethod(wr, fm.Item3, fm.Item4?.ToArray(), true); var statusCode = (int)HttpStatusCode.OK; if (methodRes is BaseResponse mRes && mRes.Status != (int)HttpStatusCode.OK) { statusCode = mRes.Status; } res = new QWebResponse { Response = JsonConvert.SerializeObject(methodRes), Status = statusCode, TraceId = request.TraceId, Headers = wr.ResponseHeader }; } catch (Exception e) { #if DEBUG res = new QWebResponse() { TraceId = request.TraceId, Status = (int)HttpStatusCode.NotFound, Response = JsonConvert.SerializeObject(e) }; #else res = new QWebResponse() { TraceId = request.TraceId, Status = (int)GlobalStatusCode.NotFound, Response = JsonConvert.SerializeObject(GlobalStatusCode.NotFound.GetEnumName()) }; #endif } return(res); }