Example #1
0
 /// <summary>
 /// 初始化
 /// </summary>
 public PullDataClient()
 {
     DataService = AppCtx.Resolve<IPullDataService>("PullService");
     if (DataService == null)
     {
         LogHelper.Debug(GetType(), "获取接口失败");
         throw new InvalidCastException("获取接口IPullDataService失败");
     }
     ProcessFactory = new DataProcessFactory();
 }
 public IDataHandler CreateHandler(int version, int actionid)
 {
     try
     {
         var result = AppCtx.Resolve <IDataHandler>(actionid.ToString());
         return(result);
     }
     catch (Exception e)
     {
         LogHelper.Error(GetType(), LogInfo.TraceToMessage(new StackTrace(true)), e);
     }
     return(null);
 }
Example #3
0
 public T Invoke <T>() => AppCtx.Resolve <T>();
Example #4
0
 public TObj Invoke() => AppCtx.Resolve <TObj>();
        /// <summary>
        /// 获取数据
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        public DataResult PullData(DataParameter parameter)
        {
            AuthenticationHelper.CreateServiceHeader(AuthKey, AuthValue);

            LogHelper.Debug(GetType(), "准备获取数据", LogInfo.ObjectToMessage(parameter));

            var success = true;
            var result  = new DataResult();
            var crchash = new CrcHash();

            var pullDataService = AppCtx.Resolve <IPullDataService>("PullService");

            //初始化异常
            if (pullDataService == null)
            {
                LogHelper.Debug(GetType(), "获取接口失败");
                return(null);
            }


            #region 开始请求
            var beginParameter = new DataParameter();
            beginParameter.Action = parameter.Action;
            LogHelper.Debug(GetType(), "发送请求", LogInfo.ObjectToMessage(beginParameter));
            var beginDataInfo = pullDataService.Begin(beginParameter);
            if (beginDataInfo == null)
            {
                success             = false;
                result.ErrorId      = (int)DataDictionary.ErrorType.DataPullBeginError;
                result.ErrorMessage = "";
                return(result);
            }
            else
            {
                result.Action     = parameter.Action;
                result.SplitCount = beginDataInfo.SpliteCount;
            }
            #endregion


            #region 请求数据
            //初始化容器以收集字符串
            var sb = new StringBuilder(beginDataInfo.SpliteCount * dataLength);

            LogHelper.Debug(GetType(), "开始请求具体数据");
            for (int i = 0; i < beginDataInfo.SpliteCount; i++)
            {
                //请求数据
                //todo:需优化,以重新请求超时未能请求到的数据
                var          tcs       = new TaskCompletionSource <DataSegment>();
                WaitCallback asyncWork = _ =>
                {
                    try
                    {
                        var dataSegment = pullDataService.Pull(beginDataInfo.DataId, i);
                        LogHelper.Debug(GetType(), string.Format("获取索引为{0}的数据:", i),
                                        LogInfo.ObjectToMessage(dataSegment));

                        var stream = StreamHeandler.StringToStream(dataSegment.DataString);
                        dataSegment = !crchash.Hash(stream, Base64Convert.FrmBase64(dataSegment.Crccode))
                                                                       ? null
                                                                       : dataSegment;
                        tcs.SetResult(dataSegment);
                    }
                    catch (Exception ex)
                    {
                        LogHelper.Error(GetType(), "获取数据出现错误", ex);
                    }
                };
                ThreadPool.QueueUserWorkItem(asyncWork);
                var task       = tcs.Task;
                var taskResult = task.Result;
                if (taskResult != null)
                {
                    sb.Insert(i * dataLength, taskResult.DataString);
                }
                else
                {
                    result.ErrorId      = (int)DataDictionary.ErrorType.DataPullError;
                    result.ErrorMessage = "";
                    success             = false;
                    break;
                }
            }
            #endregion

            #region 结束请求
            var endData = pullDataService.End(beginDataInfo.DataId, !success);
            LogHelper.Debug(GetType(), "结束请求数据", LogInfo.ObjectToMessage(endData));
            if (endData == null)
            {
                result.ErrorId      = (int)DataDictionary.ErrorType.DataPullEndError;
                result.ErrorMessage = "";
                success             = false;
            }
            #endregion

            if (success)
            {
                var stream = StreamHeandler.StringToStream(sb.ToString());
                var base64 = Base64Convert.FrmBase64(stream);
                LogHelper.Debug(GetType(), "解压请求到的数据");
                var unZipStream = ZipCompress.UnCompress(base64);
                result.CrcCode = crchash.GetHashCode(unZipStream);
                LogHelper.Debug(GetType(), "生成校验码", result.CrcCode);
                result.DataString = StreamHeandler.StreamToString(unZipStream);
                //返回
            }

            return(result);
        }
        /// <summary>
        /// 发送数据
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        public DataResult PushData(DataParameter parameter)
        {
            AuthenticationHelper.CreateServiceHeader(AuthKey, AuthValue);

            LogHelper.Debug(GetType(), "准备发送数据", LogInfo.ObjectToMessage(parameter));
            var pushDataService = AppCtx.Resolve <IPushDataService>("PushService");

            //初始化异常
            if (pushDataService == null)
            {
                LogHelper.Warn(GetType(), "获取接口失败");
                return(null);
            }

            var success       = true;
            var result        = new DataResult();
            var beginDataInfo = new DataInfo();
            var crchash       = new CrcHash();

            result.DataId     = Guid.NewGuid().ToString();
            result.Action     = parameter.Action;
            result.CrcCode    = parameter.CrcCode;
            result.DataString = parameter.DataString;

            var stream    = StreamHeandler.StringToStream(parameter.DataString);
            var zipStream = ZipCompress.Compress(stream);
            var base64    = Base64Convert.ToBase64(zipStream);
            var sb        = new StringBuilder(StreamHeandler.StreamToString(base64));
            var count     = (int)Math.Ceiling(sb.Length / (double)dataLength);

            result.SplitCount = count;

            #region 准备发送数据
            beginDataInfo.ActionId    = parameter.Action;
            beginDataInfo.DataId      = result.DataId;
            beginDataInfo.SpliteCount = count;

            LogHelper.Debug(GetType(), "开始请求发送数据", LogInfo.ObjectToMessage(beginDataInfo));
            pushDataService.Begin(beginDataInfo);
            #endregion

            #region 发送数据
            LogHelper.Debug(GetType(), "开始发送数据");
            for (int i = 0; i < count; i++)
            {
                var          tcs       = new TaskCompletionSource <bool>();
                WaitCallback asyncWork = _ =>
                {
                    try
                    {
                        var beginPos = i * dataLength;
                        var legth    = i == count - 1 ? sb.Length - beginPos : dataLength;
                        var data     = sb.ToString(beginPos, legth);

                        var dataSegment = new DataSegment();
                        dataSegment.DataId = result.DataId;
                        var crccode = crchash.GetHashCode(StreamHeandler.StringToStream(data));
                        dataSegment.Crccode    = Base64Convert.ToBase64(crccode);
                        dataSegment.DataString = data;
                        dataSegment.Index      = i;
                        LogHelper.Debug(GetType(), string.Format("发送数据,ID:{0},索引:{1}", result.DataId, i), LogInfo.ObjectToMessage(dataSegment));
                        pushDataService.Push(dataSegment);

                        tcs.SetResult(true);
                    }
                    catch (Exception ex)
                    {
                        LogHelper.Error(GetType(), "发送数据出现错误", ex);
                    }
                };
                ThreadPool.QueueUserWorkItem(asyncWork);

                var task       = tcs.Task;
                var taskResult = task.Result;
                if (!taskResult)
                {
                    success = false;
                    break;
                }
            }
            #endregion

            #region 发送完成
            var endResult = pushDataService.End(beginDataInfo.DataId, !success);
            LogHelper.Debug(GetType(), "发送数据完成");

            if (endResult == null)
            {
                success = false;
            }
            #endregion

            return(result);
        }
Example #7
0
        public DataResult End(string dataid, bool abandon)
        {
            if (!AuthenticationHelper.AuthServiceHeader())
            {
                LogHelper.Debug(GetType(), "权限校验不通过");
                return(null);
            }

            LogHelper.Debug(GetType(), string.Format("推送数据结束,数据ID为:{0},是否取消:{1}", dataid, abandon));
            if (abandon)
            {
                return(null);
            }

            if (cache == null)
            {
                cache = new AspnetCache(actionID);
            }

            var processFactory = new DataProcessFactory();

            var dataInfo   = cache.Get <DataInfo>(DataKey);
            var dataResult = new DataResult();
            var datalength = dataLength * dataInfo.SpliteCount;
            var sb         = new StringBuilder(datalength);
            var success    = true;

            for (int i = 0; i < dataInfo.SpliteCount; i++)
            {
                var data = cache.Get <string>(string.Format("{0}.{1}", dataid, i));
                if (string.IsNullOrEmpty(data))
                {
                    success = false;
                    break;
                }
                else
                {
                    sb.Append(data);
                }
            }

            if (success)
            {
                //解压
                var content = processFactory.ProcessToObject <string>(sb.ToString());

                var handler = AppCtx.Resolve <IDataHandler>(actionID);

                if (!handler.Validation(0, int.Parse(actionID)))
                {
                    //TODO: 无法通过校验,不进行处理
                }

                // handler.ProcessData<object>()


                //todo:推送完成

                #region 把内容写下来
                var          fileName     = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DateTime.Now.ToString("yyyyMMddHHmmssffff") + ".log");
                FileStream   fs           = new FileStream(fileName, FileMode.Append);
                StreamWriter streamWriter = new StreamWriter(fs);
                streamWriter.BaseStream.Seek(0, SeekOrigin.End);
                streamWriter.Write(content);
                streamWriter.WriteLine(DateTime.Now.ToString(CultureInfo.CurrentCulture));
                streamWriter.Flush();
                streamWriter.Close();
                FileInfo fileInfo = new FileInfo(fileName);
                LogHelper.Debug(GetType(), string.Format("保存成文件,路径为:{0}", fileInfo.FullName), LogInfo.ObjectToMessage(fileInfo));
                #endregion

                dataResult.DataId = dataInfo.DataId;
                dataResult.Action = dataInfo.ActionId;
                cache.Add(ContentKey, dataResult);

                cache.Clear();
                cache = null;
                return(dataResult);
            }
            else
            {
                cache.Clear();
                cache = null;
                return(null);
            }
        }