/// <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); }
public T Invoke <T>() => AppCtx.Resolve <T>();
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); }
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); } }