コード例 #1
0
        internal void PrintValues(IMethodCallMessage msg)
        {
            try {
                SeleniumLog log = SeleniumLog.Instance();
                log.Blue().WriteLine("Expand to view input parameters");
                log.SaveIndent("__SELENIUMLOG_PRINT_INPUTS__");
                log.Indent();

                int argumentIndex = 0;
                foreach (var arg in msg.Args)
                {
                    //  Display Values for custom attribute
                    CURRENT_ARGUMENT_NAME = msg.GetInArgName(argumentIndex);
                    DispalyInformation(CURRENT_ARGUMENT_NAME, arg);

                    argumentIndex++;
                }
                log.RestoreIndent("__SELENIUMLOG_PRINT_INPUTS__");
            }
            catch (Exception e)
            {
                SeleniumLog log = SeleniumLog.Instance();
                log.Warning().WriteLine("SeleniumLog Exception: 01-18 - " + e.Message);
            }
        }
コード例 #2
0
    public override IMessage Invoke(IMessage request)
    {
        IMethodCallMessage call = (IMethodCallMessage)request;

        Console.WriteLine("Invoke " + call.MethodName);

        Console.Write("ARGS(");
        for (int i = 0; i < call.ArgCount; i++)
        {
            if (i != 0)
            {
                Console.Write(", ");
            }
            Console.Write(call.GetArgName(i) + " " +
                          call.GetArg(i));
        }
        Console.WriteLine(")");
        Console.Write("INARGS(");
        for (int i = 0; i < call.InArgCount; i++)
        {
            if (i != 0)
            {
                Console.Write(", ");
            }
            Console.Write(call.GetInArgName(i) + " " +
                          call.GetInArg(i));
        }
        Console.WriteLine(")");

        ((R1)target).test_field = 1;

        IMethodReturnMessage res = RemotingServices.ExecuteMessage(target, call);

        Console.Write("RESARGS(");
        for (int i = 0; i < res.ArgCount; i++)
        {
            if (i != 0)
            {
                Console.Write(", ");
            }
            Console.Write(res.GetArgName(i) + " " +
                          res.GetArg(i));
        }
        Console.WriteLine(")");

        Console.Write("RESOUTARGS(");
        for (int i = 0; i < res.OutArgCount; i++)
        {
            if (i != 0)
            {
                Console.Write(", ");
            }
            Console.Write(res.GetOutArgName(i) + " " +
                          res.GetOutArg(i));
        }
        Console.WriteLine(")");

        return(res);
    }
コード例 #3
0
ファイル: TraceProcessor.cs プロジェクト: WrongDog/Aspect
 protected void PreProcess(ref IMethodCallMessage msg)
 {
     Trace.WriteLine(String.Format("TracePreProcessor {0} is called", msg.MethodName));
     if (msg.InArgCount > 0) Trace.WriteLine(String.Format("In Argument Count {0}", msg.InArgCount));
     for (int idx = 0; idx < msg.InArgCount; idx++)
     {
         Trace.WriteLine(String.Format("{0}={1}", msg.GetInArgName(idx), msg.GetInArg(idx)));
     }
 }
コード例 #4
0
 internal virtual string[] GetInArgNames(IMethodCallMessage m, int c)
 {
     string[] strArray = new string[c];
     for (int index = 0; index < c; ++index)
     {
         string str = m.GetInArgName(index) ?? "__param" + (object)index;
         strArray[index] = str;
     }
     return(strArray);
 }
コード例 #5
0
ファイル: KAOPHelper.cs プロジェクト: schangxiang/KAOP
        /// <summary>
        /// 获取参数字典(不包括out参数)
        /// </summary>
        /// <param name="call">方法调用消息接口</param>
        /// <returns>参数字典</returns>
        public static IDictionary <string, object> GetParamDictionary(IMethodCallMessage call)
        {
            IDictionary <string, object> paramDict = new Dictionary <string, object>();

            for (int i = 0; i < call.InArgs.Length; i++)
            {
                paramDict.Add(call.GetInArgName(i), call.InArgs[i]);
            }
            return(paramDict);
        }
コード例 #6
0
        private Dictionary <string, object> GetParameters(IMethodCallMessage mcm)
        {
            Dictionary <string, object> dictionary = new Dictionary <string, object>();

            for (int i = 0; i < mcm.InArgCount; i++)
            {
                dictionary.Add(mcm.GetInArgName(i), mcm.GetInArg(i));
            }
            return(dictionary);
        }
コード例 #7
0
        private Action <object> FindCallbackMethod(IMethodCallMessage methodCall, string callbackMethodName)
        {
            var argCount = methodCall.InArgCount;

            for (var index = 0; index < argCount; ++index)
            {
                if (methodCall.GetInArgName(index) == callbackMethodName)
                {
                    return(methodCall.GetInArg(index) as Action <object>);
                }
            }
            return(null);
        }
コード例 #8
0
ファイル: TraceProcessor.cs プロジェクト: WrongDog/Aspect
 public static string FormatInMessage(IMethodCallMessage msg)
 {
     string message = String.Format("Trace {0}.{1} is called",msg.MethodBase.DeclaringType.FullName, msg.MethodName) + System.Environment.NewLine;
     if (msg.InArgCount > 0)
     {
         message += String.Format("In Argument Count {0}", msg.InArgCount) + System.Environment.NewLine;
         for (int idx = 0; idx < msg.InArgCount; idx++)
         {
             message += String.Format("{0} = {1}", msg.GetInArgName(idx), msg.GetInArg(idx)) + System.Environment.NewLine;
         }
     }
     return message;
 }
 internal virtual string[] GetInArgNames(IMethodCallMessage m, int c)
 {
     string[] strArray = new string[c];
     for (int i = 0; i < c; i++)
     {
         string inArgName = m.GetInArgName(i);
         if (inArgName == null)
         {
             inArgName = "__param" + i;
         }
         strArray[i] = inArgName;
     }
     return strArray;
 }
コード例 #10
0
        internal void PrintValues(IMethodCallMessage msg)
        {
            int argumentIndex = 0;

            foreach (var arg in msg.Args)
            {
                //Console.WriteLine(string.Format("Argument Name: {0}", msg.GetInArgName(argumentIndex)));

                //  Display Values for custom attribute
                DispalyInformation(msg.GetInArgName(argumentIndex), arg);

                argumentIndex++;
            }
        }
コード例 #11
0
 internal virtual string[] GetInArgNames(IMethodCallMessage m, int c)
 {
     string[] strArray = new string[c];
     for (int i = 0; i < c; i++)
     {
         string inArgName = m.GetInArgName(i);
         if (inArgName == null)
         {
             inArgName = "__param" + i;
         }
         strArray[i] = inArgName;
     }
     return(strArray);
 }
コード例 #12
0
        private object FetchBody(IMethodCallMessage methodCall)
        {
            object body       = null;
            var    jsonBody   = new Dictionary <string, object>();
            var    parameters = methodCall.MethodBase.GetParameters();

            for (int i = 0; i < methodCall.ArgCount; i++)
            {
                var argName   = methodCall.GetInArgName(i);
                var arg       = methodCall.GetInArg(i);
                var parameter = parameters.First(p => p.Name == argName);

                var binding = parameter.GetCustomAttribute <ParameterBindingAttribute>();
                if (binding != null)
                {
                    if (binding.BindingType == "Body")
                    {
                        if (!ReferenceEquals(body, null))
                        {
                            var parameterName = string.Format("[{0}].[{1}]", typeof(T).Name, methodCall.MethodBase.Name);
                            throw new ArgumentException(parameterName, parameterName + " 有多个复杂类型传入,请更新全部参数使用 JsonBodyAttribute 参数绑定!");
                        }
                        body = arg;
                    }
                    else if (binding.BindingType == "JsonBody")
                    {
                        jsonBody.Add(argName, arg);
                    }
                }
                else
                {
                    jsonBody.Add(argName, arg);
                }
            }

            if (body != null && jsonBody.Count == 0)
            {
                return(body);
            }
            else if (body == null && jsonBody.Count == 1)
            {
                return(jsonBody.First().Value);
            }
            else if (body == null && jsonBody.Count != 0)
            {
                return(jsonBody);
            }

            return(null);
        }
コード例 #13
0
 internal virtual String[] GetInArgNames(IMethodCallMessage m, int c)
 {
     String[] names = new String[c];
     for (int i = 0; i < c; i++)
     {
         String name = m.GetInArgName(i);
         if (name == null)
         {
             name = "__param" + i;
         }
         names[i] = name;
     }
     return(names);
 }
コード例 #14
0
 internal virtual string[] GetInArgNames(IMethodCallMessage m, int c)
 {
     string[] array = new string[c];
     for (int i = 0; i < c; i++)
     {
         string text = m.GetInArgName(i);
         if (text == null)
         {
             text = "__param" + i;
         }
         array[i] = text;
     }
     return(array);
 }
コード例 #15
0
 public virtual void PreInvoke(IMethodCallMessage methodCallMessage)
 {
     Console.WriteLine(_LINE);
     Console.WriteLine("START METHOD : {0}", methodCallMessage.MethodName);
     Console.WriteLine(_LINE);
     for (var i = 0; i < methodCallMessage.Args.Length; i++)
     {
         Console.WriteLine("ARG{0} - {1} : {2} : {3}",
                           i,
                           methodCallMessage.GetInArgName(i),
                           methodCallMessage.InArgs[i].GetType(),
                           methodCallMessage.InArgs[i]);
     }
     Console.WriteLine();
     Console.WriteLine(_LINE);
 }
コード例 #16
0
ファイル: TracedProxy.cs プロジェクト: xsolon/if
        private Dictionary <string, object> GetParams(IMethodCallMessage methodCall)
        {
            var res = new Dictionary <string, object>();

            for (var i = 0; i < methodCall.InArgCount; i++)
            {
                var key = methodCall.GetInArgName(i);
                var val = methodCall.GetInArg(i);

                var stringVal = Serialize(val);

                res.Add(key, stringVal);
            }

            return(res);
        }
コード例 #17
0
        private string ReplenishURL(IMethodCallMessage methodCall)
        {
            var data       = new List <string>();
            var parameters = methodCall.MethodBase.GetParameters();

            for (int i = 0; i < methodCall.ArgCount; i++)
            {
                var argName   = methodCall.GetInArgName(i);
                var arg       = methodCall.GetInArg(i);
                var parameter = parameters.First(p => p.Name == argName);

                var binding = parameter.GetCustomAttribute <ParameterBindingAttribute>();
                if (binding == null)
                {
                    continue;
                }

                if (binding.BindingType == "Uri")
                {
                    data.Add(string.Format("{0}={1}", argName, Uri.EscapeUriString(ReferenceEquals(arg, null) ? "null" : arg.ToString())));
                }
                else if (binding.BindingType == "ODataParameter" && !ReferenceEquals(arg, null))
                {
                    var dataParameter = new RemoteDataParameter();

                    var processor = RemoteObjectContext.DefaultObjectResolver.GetInstance <IExpressionProcessor>();
                    processor.Writer        = RemoteObjectContext.DefaultObjectResolver.GetInstance <IExpressionWriter>();
                    processor.DataParameter = dataParameter;

                    processor.Build((arg as LambdaExpression).Body as MethodCallExpression);

                    data.Add(dataParameter.BuildUri());
                }
            }

            return(string.Join("&", data));
        }
コード例 #18
0
 public virtual String GetInArgName(int index)
 {
     return(mcm.GetInArgName(index));
 }
コード例 #19
0
        public override IMessage Invoke(IMessage msg)
        {
            IMethodCallMessage methodCall = msg as IMethodCallMessage;
            var invariantCulture          = System.Globalization.CultureInfo.InvariantCulture;

            if (null != methodCall)
            {
                try
                {
                    HttpMethod          httpMethod          = HttpMethod.Get;
                    HttpMethodAttribute httpMethodAttribute = methodCall.MethodBase.GetCustomAttribute <HttpMethodAttribute>(true);

                    if (null != httpMethodAttribute)
                    {
                        httpMethod = httpMethodAttribute.HttpMethod;
                    }

                    ResourceAttribute resourceUrlAttribute = methodCall.MethodBase.GetCustomAttribute <ResourceAttribute>(true);

                    string actionUrl = string.Empty;

                    if (null != resourceUrlAttribute)
                    {
                        actionUrl = resourceUrlAttribute.Relative;
                    }

                    Type expectedReturn = ((MethodInfo)methodCall.MethodBase).ReturnType;

                    object   retVal  = null;
                    object[] outArgs = null;

                    Dictionary <string, object> toSerialize   = new Dictionary <string, object>();
                    Dictionary <string, string> toQueryString = new Dictionary <string, string>();

                    // Determines which arguments should be used in the querystring parameters, and which arguments will be serialized and posted.
                    for (int argIndex = 0, argCount = methodCall.InArgCount; argIndex < argCount; argIndex++)
                    {
                        object value = methodCall.GetInArg(argIndex);

                        if (null == value || value.GetType().IsPrimitiveOrBasicStruct())
                        {
                            if (null != value && value is DateTime)
                            {
                                value = ((DateTime)value).ToLocalTime();

                                StringBuilder sb = new StringBuilder();
                                using (TextWriter writer = new StringWriter(sb, invariantCulture))
                                {
                                    this.m_jsonSerializer.Serialize(writer, value);
                                }

                                value = sb.ToString();
                                value = ((string)value).Substring(1, ((string)value).Length - 2);

                                toQueryString.Add(methodCall.GetInArgName(argIndex), (value != null) ? value.ToString() : string.Empty);
                            }
                            else
                            {
                                toQueryString.Add(methodCall.GetInArgName(argIndex), (value != null) ? HttpUtility.UrlEncode(value.ToString()) : string.Empty);
                            }
                        }
                        else
                        {
                            toSerialize.Add(methodCall.GetInArgName(argIndex), value);
                        }
                    }

                    {
                        // Prepare the post content.
                        byte[] postData = null;

                        string responseData;

                        if (toSerialize.Count > 0)
                        {
                            StringBuilder sb = new StringBuilder();
                            using (TextWriter writer = new StringWriter(sb, invariantCulture))
                            {
                                if (toSerialize.Count == 1)
                                {
                                    this.m_jsonSerializer.Serialize(writer, toSerialize.Values.First());
                                }
                                else
                                {
                                    this.m_jsonSerializer.Serialize(writer, toSerialize);
                                }
                            }

                            postData = Encoding.UTF8.GetBytes(sb.ToString());
                        }

                        if ((postData == null || postData.Length == 0) && httpMethod != HttpMethod.Get)
                        {
                            postData = Encoding.UTF8.GetBytes("{}");
                        }

                        // Assemble the querystring.
                        object[] urlParameters = null;

                        if (null != resourceUrlAttribute && resourceUrlAttribute.ParameterNames.Count() > 0)
                        {
                            urlParameters = new object[resourceUrlAttribute.ParameterNames.Count()];

                            for (int i = 0, total = resourceUrlAttribute.ParameterNames.Count(); i < total; i++)
                            {
                                string parameterName = resourceUrlAttribute.ParameterNames[i];

                                if (toQueryString.ContainsKey(parameterName))
                                {
                                    urlParameters[i] = toQueryString[parameterName];
                                    toQueryString.Remove(parameterName);
                                }
                                else if (toSerialize.ContainsKey(parameterName))
                                {
                                    urlParameters[i] = toSerialize[parameterName];
                                    toSerialize.Remove(parameterName);
                                }
                            }
                        }

                        var queryString = string.Empty;

                        if (toQueryString.Count > 0)
                        {
                            queryString = "?" + string.Join("&", (from kvp in toQueryString select kvp.Key + "=" + kvp.Value).ToArray());
                        }

                        // Determine the final url
                        if (null != urlParameters)
                        {
                            actionUrl = string.Format(invariantCulture, actionUrl, urlParameters);
                        }

                        string serviceUrl = this.Configuration.Root + this.Configuration.Relative + actionUrl + queryString;

                        // Create the request context
                        RequestContext context = this.Context.CreateRequestContext();

                        context.RequestUrl = new Uri(serviceUrl);

                        // Create and configure the HTTP request
                        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(context.RequestUrl);
                        {
                            webRequest.Method  = httpMethod.ToString().ToUpper();
                            webRequest.Timeout = this.Configuration.RequestTimeout ?? (5 * 60 * 1000);

                            if (null != this.Configuration.RequestHeaders)
                            {
                                foreach (var kvp in this.Configuration.RequestHeaders)
                                {
                                    webRequest.Headers[kvp.Key] = kvp.Value;
                                }
                            }

                            if (null != postData && postData.Length > 0)
                            {
                                webRequest.ContentLength = postData.Length;
                                webRequest.ContentType   = "application/json; charset=UTF-8";

                                Stream postStream = webRequest.GetRequestStream();
                                postStream.Write(postData, 0, postData.Length);
                                postStream.Close();
                            }
                        }

                        HttpWebResponse response = null;

                        {
                            Stopwatch timer = Stopwatch.StartNew();

                            try
                            {
                                // Add a HTTP header with a random number to help tracking the request here and on the remote server
                                int randomNumber = new Random().Next(int.MaxValue);

                                webRequest.Headers["X-SP-Unique-Identifier"] = randomNumber.ToString(invariantCulture);

                                // Send the request
                                response = (HttpWebResponse)webRequest.GetResponse();
                            }
                            catch (WebException ex)
                            {
                                string errorContent = null;

                                if (ex.Response != null)
                                {
                                    context.ResponseStatus = (int)((HttpWebResponse)ex.Response).StatusCode;

                                    if (ex.Response.ContentLength != 0)
                                    {
                                        using (var stream = ex.Response.GetResponseStream())
                                        {
                                            if (null != stream)
                                            {
                                                using (var reader = new StreamReader(stream))
                                                {
                                                    errorContent = reader.ReadToEnd();

                                                    context.ResponseSize = errorContent.Length;
                                                }
                                            }
                                        }

                                        string errorResult = null;

                                        if (null != errorContent)
                                        {
                                            using (StringReader r = new StringReader(errorContent))
                                            {
                                                errorResult = r.ReadToEnd();
                                            }
                                        }

                                        if (!string.IsNullOrWhiteSpace(errorResult))
                                        {
                                            context.ResponseContent = errorResult;

                                            throw new ProxyException(errorResult, (HttpWebResponse)ex.Response);
                                        }
                                    }
                                }

                                throw new ProxyException(string.Format(invariantCulture, "Exception caught while performing a {0} request to url '{1}'. {2}: {3}", httpMethod.ToString(), serviceUrl, ex.GetType().Name, ex.Message), ex);
                            }
                            finally
                            {
                                var elapsedMilliseconds = timer.ElapsedMilliseconds;

                                timer.Stop();

                                context.RequestElapsedMilliseconds = elapsedMilliseconds;
                                context.RequestElapsedTime         = new TimeSpan(0, 0, 0, 0, (int)elapsedMilliseconds);
                            }

                            context.ResponseHeaders.Clear();

                            // Add the response information to the context
                            for (int index = 0, total = response.Headers.Count; index < total; index++)
                            {
                                context.ResponseHeaders[response.Headers.GetKey(index)] = response.Headers.Get(index);
                            }

                            context.ResponseStatus = (int)response.StatusCode;

                            if ((int)response.StatusCode >= 400)
                            {
                                throw new ProxyException("Invalid HTTP status code.", response);
                            }

                            // Read the response contents
                            Stream responseStream = response.GetResponseStream();

                            using (StreamReader responseReader = new StreamReader(responseStream))
                            {
                                responseData = responseReader.ReadToEnd();

                                // note: context.ResponseSize should be in bytes, not string length
                                // ContentLength should be length reported in the Content-Length header (number of octets)
                                context.ResponseSize = response.ContentLength;

                                context.ResponseContent = responseData;

                                responseReader.Close();
                            }

                            responseStream.Close();
                            response.Close();
                        }

                        // Attempt to deserialize the response contents
                        if (context.ResponseHeaders.ContainsKey("Content-Type"))
                        {
                            string contentType = (context.ResponseHeaders["Content-Type"] ?? string.Empty).Split(';').FirstOrDefault(h => !h.Trim().StartsWith("charset", StringComparison.OrdinalIgnoreCase));

                            string temp = contentType.Split('/').Last();

                            if (temp.EndsWith("json", StringComparison.OrdinalIgnoreCase) || temp.EndsWith("javascript", StringComparison.OrdinalIgnoreCase))
                            {
                                using (StringReader r = new StringReader(responseData))
                                {
                                    using (JsonReader r2 = new JsonTextReader(r))
                                    {
                                        r2.DateTimeZoneHandling = DateTimeZoneHandling.Utc;

                                        if (expectedReturn != typeof(void))
                                        {
                                            retVal = this.m_jsonSerializer.Deserialize(r2, expectedReturn);
                                        }
                                    }
                                }
                            }
                            else
                            {
                                throw new ProxyException("Unknown response content type: " + contentType, response);
                            }
                        }
                    }

                    int outArgsCount = null != outArgs ? outArgs.Length : 0;

                    IMethodReturnMessage callResult = new ReturnMessage(retVal, outArgs, outArgsCount, methodCall.LogicalCallContext, methodCall);

                    return(callResult);
                }
                catch (Exception e)
                {
                    return(new ReturnMessage(e, methodCall));
                }
            }
            else
            {
                throw new NotSupportedException();
            }
        }
コード例 #20
0
ファイル: ActionProxy.cs プロジェクト: xiaohszx/SharpNetSH
        private string ProcessParameters(MethodBase method, IMethodCallMessage methodCall)
        {
            var results = new List <string>();
            var i       = 0;

            foreach (var value in methodCall.InArgs)
            {
                var parameter     = method.GetParameters().FirstOrDefault(x => x.Name == methodCall.GetInArgName(i));
                var parameterName = parameter.GetParameterName();
                i++;

                if (value == null)
                {
                    continue;
                }

                if (value is bool)
                {
                    // We have to process booleans differently based upon the configured boolean type (i.e. Yes/No, Enable/Disable, True/False outputs)
                    results.Add(parameterName + "=" + parameter.GetBooleanType().GetBooleanValue((bool)value));
                }
                else if (value is Guid)
                {
                    // Guids have to contain braces
                    results.Add(parameterName + "=" + ((Guid)value).ToString("B"));
                }
                else if (value.GetType().IsEnum)
                {
                    // Enums might be configured with a custom description to change how to output their text
                    results.Add(parameterName + "=" + value.GetDescription());
                }
                else
                {
                    // Otherwise it's a stringable (i.e. ToString()) property
                    results.Add(parameterName + "=" + value);
                }
            }
            if (results.Count == 0)
            {
                return(method.GetMethodName());
            }
            return(method.GetMethodName() + " " + results.Aggregate((x, y) => string.IsNullOrWhiteSpace(x) ? y : x + " " + y));
        }
コード例 #21
0
        public override IMessage Invoke(IMessage msg)
        {
            #region 日志准备

            List <string> opObjPerporty = UtilitysForT <SSY_LOGENTITY> .GetAllColumns(new SSY_LOGENTITY()); //要操作的属性名

            List <string> opWherePerporty = new List <string>();                                            //where条件属性名
            opWherePerporty.Add("LOGID");
            List <string> mainProperty = new List <string>();                                               //主键属性名
            mainProperty.Add("LOGID");

            //string errStr = string.Empty;
            List <string>        errStr  = new List <string>();
            List <SSY_LOGENTITY> opList  = new List <SSY_LOGENTITY>();
            SSY_LOGENTITY        logenti = null;

            BizExectuteCommon recordLog = new BizExectuteCommon(ManagerSysEnvironment.GetSysEnvironmentSerialize()); //其他工厂记录日志也利用该公共方法

            //日志固定部分
            string USERNAMES = string.Empty;
            if (FrameCommon.SysEnvironment.SysUserDict != null)
            {
                if (FrameCommon.SysEnvironment.SysUserDict.USERNAME != null)
                {
                    USERNAMES = FrameCommon.SysEnvironment.SysUserDict.USERNAME.ToString();
                }
            }
            string IPS = string.Empty;
            if (!string.IsNullOrEmpty(FrameCommon.SysEnvironment.Ips))
            {
                IPS = FrameCommon.SysEnvironment.Ips;
            }
            string SYSTEMNAME = string.Empty;
            if (!string.IsNullOrEmpty(FrameCommon.SysEnvironment.distManagerParam.DistributeDataNodes[0].Systemname))
            {
                SYSTEMNAME = FrameCommon.SysEnvironment.distManagerParam.DistributeDataNodes[0].Systemname;
            }

            #endregion

            IMethodCallMessage mcall = (IMethodCallMessage)msg; //劫持方法,准备执行
            var resResult            = new ReturnMessage(new Exception(), mcall);

            #region 获取必要参数

            //distributeActionIden  分布式动作识别, 必须存在
            //distributeDataNodes 分布式数据节点集合, 必须存在
            //distributeDataNode 分布式数据节点参数, 必须存在
            //distriActionSql 分布式操作sql集合,必须存在,包括sql正文和参数
            //ddnmParams

            //singleActionList  单点操作失败集合, out参数 非必须存在,传入空的参数即可

            //TODO 检查必须的参数,若不存在不进行执行业务方法,返回执行异常

            //获取分布式管理参数
            DistributeDataNodeManagerParams distManagerParam = new  DistributeDataNodeManagerParams();
            for (int i = 0; i < mcall.InArgs.Length; i++)
            {
                if (mcall.GetInArgName(i).ToUpper() == "ddnmParams".ToUpper())
                {
                    distManagerParam = ((DistributeDataNodeManagerParams)mcall.GetInArg(i));
                    //SYSTEMNAME = distManagerParam.DistributeDataNodes[0].Systemname;
                    break;
                }
            }

            //获取分布式动作识别参数
            DistributeActionIden distBAC = distManagerParam.DistributeActionIden;

            //加载数据节点集合,然后根据节点数量及分布式动作识别初始化分布式数据节点及分布式事务处理
            //数据节点集合由服务方法传入
            //获取数据节点集合参数
            List <SSY_DATANODE_ADDR> dataNodes = distManagerParam.DistributeDataNodes;

            //获取数据节点参数
            DistributeDataNode ddn = distManagerParam.DistributeDataNode;

            //单点操作失败集合,最后要报告给节点中心,out参数
            bool permitSingleDataOperation = false; //是否支持单点操作失败后进行报告
            List <SSY_DATA_ACTION_TASK> data_action_task = new List <SSY_DATA_ACTION_TASK>();
            for (int i = 0; i < mcall.InArgs.Length; i++)
            {
                if (mcall.GetInArgName(i).ToUpper() == "singleActionList".ToUpper())
                {
                    permitSingleDataOperation = true;
                    data_action_task          = mcall.GetInArg(i) as List <SSY_DATA_ACTION_TASK>;
                    break;
                }
            }

            #endregion

            if (distBAC == DistributeActionIden.Query)
            {
                //处理数据节点
                //distManagerParam.DistributeDataNode
                distManagerParam.DistributeDataNode.Connectionstring = string.Format(dataNodes[0].Data_conn, dataNodes[0].Url_addr,
                                                                                     dataNodes[0].Data_user, dataNodes[0].Data_password);
                distManagerParam.DistributeDataNode.DbSchema = dataNodes[0].Data_schema;

                //只执行一次即可
                #region 执行业务方法

                try
                {
                    object objRv = mcall.MethodBase.Invoke(this.Target, mcall.Args);

                    #region 记录业务日志

                    //执行方法后记录正常业务日志,内容来自方法ListBizLog参数
                    //若要记录日志,要求该方法必须传入该参数,且名字必须为ListBizLog,内容为要记录的业务日志内容
                    SSY_LOGENTITY tempLog = null;
                    for (int i = 0; i < mcall.InArgs.Length; i++)
                    {
                        if (mcall.GetInArgName(i).ToUpper() == "ListBizLog".ToUpper())
                        {
                            List <SSY_LOGENTITY> dictBizLog = mcall.GetInArg(i) as List <SSY_LOGENTITY>;

                            for (int j = 0; j < dictBizLog.Count; j++)
                            {
                                //遍历记录业务日志
                                tempLog = dictBizLog[j] as SSY_LOGENTITY;

                                //获取日志控制,确定是否记录该类日志
                                if (recordLog.CheckIsRecord(tempLog.DOMAINNAME.ToString(), tempLog.OPTIONNAME.ToString(), distManagerParam))
                                {
                                    tempLog.LOGID = recordLog.GetID(MakeIDType.YMDHMS_3, string.Empty, null, distManagerParam);

                                    //业务直接使用业务端提交的数据,不在读取框架环境变量,因为登录时这部分数据滞后,导致不能记入日志
                                    //tempLog.USERNAMES = USERNAMES;
                                    //tempLog.IPS = IPS;
                                    //tempLog.SYSTEMNAME = SYSTEMNAME;

                                    opList.Add(tempLog);
                                }
                            }
                            if (opList.Count > 0)
                            {
                                //记录日志
                                bool flag = recordLog.OpBizObjectSingle <SSY_LOGENTITY>(opList, opObjPerporty, opWherePerporty, mainProperty, errStr, distManagerParam);
                            }
                            break;
                        }
                    }

                    #endregion

                    resResult = new ReturnMessage(objRv, mcall.Args, mcall.Args.Length, mcall.LogicalCallContext, mcall);
                }
                catch (Exception ex)
                {
                    Common.Utility.RecordLog("工厂 Query 模式发生异常!原因" + ex.Message + ex.Source, this.logpathForDebug, this.isLogpathForDebug);

                    #region 记录异常日志

                    if (ex.InnerException != null)
                    {
                        //获取日志控制,确定是否记录该类日志
                        if (recordLog.CheckIsRecord("ExceptionErr", "ExceptionErr", distManagerParam))
                        {
                            //处理异常类相关信息
                            string CLASSNAME   = mcall.TypeName;
                            string METHORDNAME = mcall.MethodName;

                            //异常时这部分可没有内容
                            string TABLENAME            = "";
                            string RECORDIDENCOLS       = "";
                            string RECORDIDENCOLSVALUES = "";
                            string FUNCTIONNAME         = "";

                            logenti = LogCommon.CreateLogDataEnt(LogTypeDomain.ExceptionErr, LogLevelOption.ExecptionErr, recordLog.GetSystemDateTime(distManagerParam),
                                                                 CLASSNAME, METHORDNAME, LogAction.ExecptionErr, TABLENAME, RECORDIDENCOLS, RECORDIDENCOLSVALUES, USERNAMES, IPS, FUNCTIONNAME,
                                                                 ex.InnerException.Message, SYSTEMNAME, "");
                            logenti.LOGID = recordLog.GetID(MakeIDType.YMDHMS_3, string.Empty, null, distManagerParam);

                            opList.Add(logenti);

                            if (opList.Count > 0)
                            {
                                //记录日志
                                bool flag = recordLog.OpBizObjectSingle <SSY_LOGENTITY>(opList, opObjPerporty, opWherePerporty, mainProperty, errStr, distManagerParam);
                            }
                        }

                        resResult = new ReturnMessage(ex.InnerException, mcall);
                    }

                    #endregion

                    resResult = new ReturnMessage(ex, mcall);
                }

                #endregion
            }
            else if (distBAC == DistributeActionIden.SingleAction)
            {
                //数据节点有几个执行几次,单次提交,发现执行异常,将异常报告给节点中心,继续执行,直到完毕
                for (int m = 0; m < dataNodes.Count; m++)
                {
                    //ddn.DbFactoryName  数据库工厂取配置文件,目前不考虑同构不同种类的数据库
                    distManagerParam.DistributeDataNode.Connectionstring = string.Format(dataNodes[m].Data_conn, dataNodes[m].Url_addr, dataNodes[m].Data_user,
                                                                                         dataNodes[m].Data_password);
                    distManagerParam.DistributeDataNode.DbSchema = dataNodes[m].Data_schema;

                    #region 执行业务方法

                    try
                    {
                        object objRv = mcall.MethodBase.Invoke(this.Target, mcall.Args);

                        #region 记录业务日志

                        //执行方法后记录正常业务日志,内容来自方法ListBizLog参数
                        //若要记录日志,要求该方法必须传入该参数,且名字必须为ListBizLog,内容为要记录的业务日志内容
                        SSY_LOGENTITY tempLog = null;
                        for (int i = 0; i < mcall.InArgs.Length; i++)
                        {
                            if (mcall.GetInArgName(i).ToUpper() == "ListBizLog".ToUpper())
                            {
                                List <SSY_LOGENTITY> dictBizLog = mcall.GetInArg(i) as List <SSY_LOGENTITY>;

                                for (int j = 0; j < dictBizLog.Count; j++)
                                {
                                    //遍历记录业务日志
                                    tempLog = dictBizLog[j] as SSY_LOGENTITY;

                                    //获取日志控制,确定是否记录该类日志
                                    if (recordLog.CheckIsRecord(tempLog.DOMAINNAME.ToString(), tempLog.OPTIONNAME.ToString(), distManagerParam))
                                    {
                                        tempLog.LOGID = recordLog.GetID(MakeIDType.YMDHMS_3, string.Empty, null, distManagerParam);

                                        //业务直接使用业务端提交的数据,不在读取框架环境变量,因为登录时这部分数据滞后,导致不能记入日志
                                        //tempLog.USERNAMES = USERNAMES;
                                        //tempLog.IPS = IPS;
                                        //tempLog.SYSTEMNAME = SYSTEMNAME;

                                        opList.Add(tempLog);
                                    }
                                }
                                if (opList.Count > 0)
                                {
                                    //记录日志
                                    bool flag = recordLog.OpBizObjectSingle <SSY_LOGENTITY>(opList, opObjPerporty, opWherePerporty, mainProperty, errStr, distManagerParam);
                                }
                                break;
                            }
                        }

                        #endregion

                        resResult = new ReturnMessage(objRv, mcall.Args, mcall.Args.Length, mcall.LogicalCallContext, mcall);
                    }
                    catch (Exception ex)
                    {
                        SSY_DATA_ACTION_TASK tempDataTask = null;

                        #region 记录异常日志

                        if (ex.InnerException != null)
                        {
                            //获取日志控制,确定是否记录该类日志
                            if (recordLog.CheckIsRecord("ExceptionErr", "ExceptionErr", distManagerParam))
                            {
                                //处理异常类相关信息
                                string CLASSNAME   = mcall.TypeName;
                                string METHORDNAME = mcall.MethodName;

                                //异常时这部分可没有内容
                                string TABLENAME            = "";
                                string RECORDIDENCOLS       = "";
                                string RECORDIDENCOLSVALUES = "";
                                string FUNCTIONNAME         = "";

                                logenti = LogCommon.CreateLogDataEnt(LogTypeDomain.ExceptionErr, LogLevelOption.ExecptionErr, recordLog.GetSystemDateTime(distManagerParam),
                                                                     CLASSNAME, METHORDNAME, LogAction.ExecptionErr, TABLENAME, RECORDIDENCOLS, RECORDIDENCOLSVALUES, USERNAMES, IPS, FUNCTIONNAME,
                                                                     ex.InnerException.Message, SYSTEMNAME, "");
                                logenti.LOGID = recordLog.GetID(MakeIDType.YMDHMS_3, string.Empty, null, distManagerParam);

                                opList.Add(logenti);

                                if (opList.Count > 0)
                                {
                                    //记录日志
                                    bool flag = recordLog.OpBizObjectSingle <SSY_LOGENTITY>(opList, opObjPerporty, opWherePerporty, mainProperty, errStr, distManagerParam);
                                }
                            }
                            if (permitSingleDataOperation)
                            {
                                #region 获取失败操作sql

                                //获取失败记录,以便将任务报告给节点中心
                                //获取操作sql  List<DistActionSql> DistriActionSqlParams

                                for (int task = 0; task < distManagerParam.DistriActionSqlParams.Count; task++)
                                {
                                    tempDataTask            = new SSY_DATA_ACTION_TASK();
                                    tempDataTask.Action_sql = distManagerParam.DistriActionSqlParams[task].ActionSqlText;
                                    string tempSqlParamSeq = string.Empty;
                                    bool   temddddd        = JsonSerializer.Serialize(distManagerParam.DistriActionSqlParams[task].ActionSqlTextParams, out tempSqlParamSeq);
                                    //保存sql参数序列化结果
                                    tempDataTask.Action_sql_params = tempSqlParamSeq;
                                    tempDataTask.Data_real_conn    = ddn.Connectionstring;
                                    data_action_task.Add(tempDataTask);
                                }
                                //执行完毕后,清除本次的sql记录
                                distManagerParam.DistriActionSqlParams.Clear();

                                //TODO 报告单点异常给节点中心,暂时不支持,后续扩展
                                #endregion
                            }
                        }

                        #endregion

                        continue; //继续执行
                    }

                    #endregion
                }
            }
            else if (distBAC == DistributeActionIden.TransAction)
            {
                try
                {
                    //分布式事务执行, 按数据节点数量执行,同步提交
                    using (var ts = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, TimeSpan.FromHours(1)))
                    {
                        for (int m = 0; m < dataNodes.Count; m++)
                        {
                            //ddn.DbFactoryName  数据库工厂取配置文件,目前不考虑同构不同种类的数据库
                            distManagerParam.DistributeDataNode.Connectionstring = string.Format(dataNodes[m].Data_conn, dataNodes[m].Url_addr, dataNodes[m].Data_user,
                                                                                                 dataNodes[m].Data_password);
                            distManagerParam.DistributeDataNode.DbSchema = dataNodes[m].Data_schema;

                            #region 执行业务方法

                            object objRv = mcall.MethodBase.Invoke(this.Target, mcall.Args);

                            #region 记录业务日志

                            //执行方法后记录正常业务日志,内容来自方法ListBizLog参数
                            //若要记录日志,要求该方法必须传入该参数,且名字必须为ListBizLog,内容为要记录的业务日志内容
                            SSY_LOGENTITY tempLog = null;
                            for (int i = 0; i < mcall.InArgs.Length; i++)
                            {
                                if (mcall.GetInArgName(i).ToUpper() == "ListBizLog".ToUpper())
                                {
                                    List <SSY_LOGENTITY> dictBizLog = mcall.GetInArg(i) as List <SSY_LOGENTITY>;

                                    for (int j = 0; j < dictBizLog.Count; j++)
                                    {
                                        //遍历记录业务日志
                                        tempLog = dictBizLog[j] as SSY_LOGENTITY;

                                        //获取日志控制,确定是否记录该类日志
                                        if (recordLog.CheckIsRecord(tempLog.DOMAINNAME.ToString(), tempLog.OPTIONNAME.ToString(), distManagerParam))
                                        {
                                            tempLog.LOGID = recordLog.GetID(MakeIDType.YMDHMS_3, string.Empty, null, distManagerParam);

                                            //业务直接使用业务端提交的数据,不在读取框架环境变量,因为登录时这部分数据滞后,导致不能记入日志
                                            //tempLog.USERNAMES = USERNAMES;
                                            //tempLog.IPS = IPS;
                                            //tempLog.SYSTEMNAME = SYSTEMNAME;

                                            opList.Add(tempLog);
                                        }
                                    }
                                    //这里事物不能同时记录日志,需要放到业务方法提交完成后单独记录日志
                                    if (opList.Count > 0)
                                    {
                                        //记录日志
                                        bool flag = recordLog.OpBizObjectSingle <SSY_LOGENTITY>(opList, opObjPerporty, opWherePerporty, mainProperty, errStr, distManagerParam);
                                    }
                                    break;
                                }
                            }

                            #endregion

                            resResult = new ReturnMessage(objRv, mcall.Args, mcall.Args.Length, mcall.LogicalCallContext, mcall);

                            #endregion
                        }

                        ts.Complete();
                        ts.Dispose();
                    }

                    //同时记录日志,因为日志记录去掉事物方式
                    ////恢复事物默认标识
                    //distManagerParam.DistributeActionIden = DistributeActionIden.Query;
                    ////启用事物日志需要独立记录,不能和业务操作混在一个事物里
                    //for (int m = 0; m < dataNodes.Count; m++)
                    //{
                    //    //ddn.DbFactoryName  数据库工厂取配置文件,目前不考虑同构不同种类的数据库
                    //    distManagerParam.DistributeDataNode.Connectionstring = string.Format(dataNodes[m].Data_conn, dataNodes[m].Url_addr, dataNodes[m].Data_user,
                    //    dataNodes[m].Data_password);
                    //    distManagerParam.DistributeDataNode.DbSchema = dataNodes[m].Data_schema;

                    //    if (opList.Count > 0)
                    //    {
                    //        //记录日志
                    //        bool flag = recordLog.OpBizObjectSingle<SSY_LOGENTITY>(opList, opObjPerporty, opWherePerporty, mainProperty, errStr, distManagerParam);

                    //    }
                    //}
                }
                catch (Exception ex)
                {
                    Common.Utility.RecordLog("工厂 TransAction 模式发生异常!原因" + ex.Message + ex.Source, this.logpathForDebug, this.isLogpathForDebug);
                }
            }

            //最终返回结果,循环处理数据节点时,只返回最后一个执行成功的数据节点的执行情况
            return(resResult);
        }
コード例 #22
0
        internal void PrintValues(IMethodCallMessage msg)
        {
            try {
                SeleniumLog log = SeleniumLog.Instance();
                log.Blue().WriteLine("Expand to view input parameters");
                log.SaveIndent("__SELENIUMLOG_PRINT_INPUTS__");
                log.Indent();

                int argumentIndex = 0;
                foreach (var arg in msg.Args)
                {
                    //  Display Values for custom attribute
                    CURRENT_ARGUMENT_NAME = msg.GetInArgName(argumentIndex);
                    DispalyInformation(CURRENT_ARGUMENT_NAME, arg);

                    argumentIndex++;
                }
                log.RestoreIndent("__SELENIUMLOG_PRINT_INPUTS__");
            }
            catch (Exception e)
            {
                SeleniumLog log = SeleniumLog.Instance();
                log.Warning().WriteLine("SeleniumLog Exception: 01-18 - " + e.Message);
            }
        }
コード例 #23
0
 public string GetInArgName(int index)
 {
     return(orig.GetInArgName(index));
 }
コード例 #24
0
 [System.Security.SecurityCritical]  // auto-generated
 internal virtual String[] GetInArgNames(IMethodCallMessage m, int c)
 {
     String[] names = new String[c];
     for (int i = 0; i < c; i++)
     {
         String name = m.GetInArgName(i);
         if (name == null)
         {
             name = "__param" + i;
         }
         names[i] = name;
     }
     return names;
 }
コード例 #25
0
        internal void PrintValues(IMethodCallMessage msg)
        {
            int argumentIndex = 0;
            foreach (var arg in msg.Args)
            {
                //Console.WriteLine(string.Format("Argument Name: {0}", msg.GetInArgName(argumentIndex)));

                //  Display Values for custom attribute
                DispalyInformation(msg.GetInArgName(argumentIndex), arg);

                argumentIndex++;
            }
        }