Esempio n. 1
0
        private async Task LocalExecute(MicroEntry entry, InvokeMessage invokeMessage, MessageResult messageResult)
        {
            try
            {
                //if (_logger.IsEnabled(LogLevel.Debug))
                //    _logger.LogDebug(JsonConvert.SerializeObject(invokeMessage));
                if (entry.IsNotify)
                {
                    await entry.Invoke(invokeMessage.Parameters);
                }
                else
                {
                    var data = await entry.Invoke(invokeMessage.Parameters);

                    if (!(data is Task task))
                    {
                        messageResult.Content = data;// new DynamicMessage(data);
                    }
                    else
                    {
                        await task;
                        var   taskType = task.GetType().GetTypeInfo();
                        if (taskType.IsGenericType)
                        {
                            var prop = taskType.GetProperty("Result");
                            if (prop != null)
                            {
                                messageResult.Content = prop.GetValue(task); // new DynamicMessage(prop.GetValue(task));
                            }
                        }
                    }
                }
Esempio n. 2
0
        /// <summary>
        /// 调用方法
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        public InvokeData CallMethod(InvokeMessage message)
        {
            #region 设置请求信息

            RequestMessage reqMsg = new RequestMessage();
            reqMsg.InvokeMethod  = true;
            reqMsg.AppName       = appName;                                 //应用名称
            reqMsg.HostName      = hostName;                                //客户端名称
            reqMsg.IPAddress     = ipAddress;                               //客户端IP地址
            reqMsg.ServiceName   = message.ServiceName;                     //服务名称
            reqMsg.MethodName    = message.MethodName;                      //方法名称
            reqMsg.ReturnType    = typeof(string);                          //返回类型
            reqMsg.TransactionId = Guid.NewGuid();                          //传输ID号

            #endregion

            //给参数赋值
            reqMsg.Parameters["InvokeParameter"] = message.Parameters;

            //调用服务
            var resMsg = service.CallService(reqMsg);

            //如果有异常,向外抛出
            if (resMsg.IsError)
            {
                throw resMsg.Error;
            }

            //返回数据
            return(resMsg.Value as InvokeData);
        }
Esempio n. 3
0
        /// <summary>
        /// 调用分布式服务
        /// </summary>
        /// <param name="node"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public InvokeData Invoke(ServerNode node, InvokeMessage message)
        {
            if (node == null)
            {
                throw new WarningException("Server node can't for empty!");
            }

            //获取本地服务
            IService service = GetLocalService(message);

            if (service == null)
            {
                if (singleton.proxies.ContainsKey(node.Key.ToLower()))
                {
                    service = singleton.proxies[node.Key.ToLower()];
                }
                else
                {
                    if (node.Format == TransferType.Json)
                    {
                        service = new InvokeProxy(node, container);
                    }
                    else
                    {
                        service = new RemoteProxy(node, container);
                    }
                }
            }

            //获取服务内容
            return(GetInvokeData(message, service));
        }
Esempio n. 4
0
        private Stream EncodeMessage(InvokeMessage message)
        {
            var outStream = new MemoryStream();

            using (BinaryWriter writer = new BinaryWriter(outStream, Encoding.UTF8, true))
            {
                writer.Write(long.MaxValue);
                writer.Write(message.Id.ToByteArray());
                writer.Write((byte)MessageType.Message);
                //---
                writer.Write(message.SubObjectId);
                //---
                writer.Write(message.MethodName);
                //---
                writer.Write(JsonConvert.SerializeObject(message.Args));
                //---
                foreach (var keyStream in message.Streams)
                {
                    writer.Write(keyStream.Key);
                    WriteStream(writer, keyStream.Value);
                }
                outStream.Position = 0;
                writer.Write(outStream.Length - sizeof(long));
            }
            return(outStream);
        }
Esempio n. 5
0
        /// <summary> 执行请求 </summary>
        /// <param name="endPoint"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        private async Task <ResultMessage> InvokeAsync(EndPoint endPoint, InvokeMessage message)
        {
            var client = _clientFactory.CreateClient(endPoint);
            var result = await client.Send(message);

            return(result);
        }
Esempio n. 6
0
        private InvokeData AsyncCaller(InvokeMessage message)
        {
            InvokeResponse data;

            //开始计时
            var watch = Stopwatch.StartNew();

            try
            {
                //调用服务
                var invokeData = CastleFactory.Create().Invoke(node, message);
                data = new InvokeResponse(invokeData);
            }
            catch (Exception ex)
            {
                data = new InvokeResponse {
                    Exception = ex
                };
            }

            watch.Stop();
            data.ElapsedMilliseconds = watch.ElapsedMilliseconds;

            return(data);
        }
Esempio n. 7
0
        /// <summary>
        /// 消息数据处理
        /// </summary>
        private void ProcessData()
        {
            while (IsAvailable)
            {
                try
                {
                    byte[] data = null;
                    lock (MessageLine)
                    {
                        if (MessageLine.Count > 0)
                        {
                            data = MessageLine.Dequeue();
                        }
                        else
                        {
                            ProcessFlag = true;
                            Monitor.Wait(MessageLine);
                        }
                    }

                    if (data != null)
                    {
                        InvokeMessage?.Invoke(data);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    Dispose("ProcessData " + e.Message);
                }
            }
        }
Esempio n. 8
0
        /// <summary>
        /// 通用方法
        /// </summary>
        /// <param name="msg"></param>
        /// <returns></returns>
        public InvokeMessage Invoke(InvokeMessage msg)
        {
            string resultResponse = "";

            if (msg == null)
            {
                return(null);
            }
            try
            {
                if (DataFormatter == "Xml")
                {
                    string      xmlString   = TurnToXml(typeof(InvokeMessage), msg);
                    HttpContent httpContent = new StringContent(xmlString, Encoding.UTF8);
                    httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/xml");
                    var response = _client.PutAsync("/DataService/webapi/Invoke", httpContent).Result;
                    if (response.IsSuccessStatusCode)
                    {
                        resultResponse = response.Content.ReadAsStringAsync().Result;
                        string newXml = Regex.Replace(resultResponse, @"(xmlns:?[^=]*=[""][^""]*[""])", "", RegexOptions.IgnoreCase |
                                                      RegexOptions.Multiline);
                        using (StringReader sr = new StringReader(newXml))
                        {
                            XmlSerializer xmlSerializer = new XmlSerializer(typeof(InvokeMessage));  //去掉命名空间
                            return((InvokeMessage)xmlSerializer.Deserialize(sr));
                        }
                    }
                    else
                    {
                        msg.IsSuccess = false;
                        msg.ErrorMsg  = "通讯错误";
                        return(msg);
                    }
                }
                if (DataFormatter == "Json")
                {
                    string jsonString = JsonSerialize(msg);
                    //设置Json格式,把参数以Json格式上传
                    HttpContent httpContent = new StringContent(jsonString, Encoding.UTF8);
                    httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                    var response = _client.PostAsync("/DataService/webapi/Invoke", httpContent).Result;
                    if (response.IsSuccessStatusCode)
                    {
                        resultResponse = response.Content.ReadAsStringAsync().Result;
                        return(JsonConvert.DeserializeObject <InvokeMessage>(resultResponse));
                    }
                    else
                    {
                        msg.IsSuccess = false;
                        msg.ErrorMsg  = "通讯错误";
                        return(msg);
                    }
                }
                return(null);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Esempio n. 9
0
        public async Task <MessageResult> Send(InvokeMessage message)
        {
            var watch = Stopwatch.StartNew();

            try
            {
                if (_logger.IsEnabled(LogLevel.Debug))
                {
                    _logger.LogDebug("准备发送消息");
                }
                var callback = RegistCallbackAsync(message.Id);
                if (_logger.IsEnabled(LogLevel.Debug))
                {
                    _logger.LogDebug($"{_sender.GetType()}:send :{JsonConvert.SerializeObject(message)}");
                }
                //发送
                await _sender.Send(message);

                if (_logger.IsEnabled(LogLevel.Debug))
                {
                    _logger.LogDebug("消息发送成功");
                }
                return(await callback);
            }
            finally
            {
                watch.Stop();
                if (_logger.IsEnabled(LogLevel.Debug))
                {
                    _logger.LogDebug($"send message {watch.ElapsedMilliseconds} ms");
                }
            }
        }
Esempio n. 10
0
        /// <summary>
        /// 获取调用的数据
        /// </summary>
        /// <param name="message"></param>
        /// <param name="service"></param>
        /// <returns></returns>
        private InvokeData GetInvokeData(InvokeMessage message, IService service)
        {
            //调用分布式服务
            var caller = new InvokeCaller(config.AppName, service);

            return(caller.CallMethod(message));
        }
Esempio n. 11
0
        public object Invoke(InvokeMessage message, Func <long, Type, object> hardbjectFor)
        {
            var targetMethod = GetTargetMethod(message.MethodName)
                               ?? throw new Exception($"Method {message.MethodName} was not found");
            var parameters = GetArguments(message, hardbjectFor, targetMethod);

            return(targetMethod.Invoke(instance, parameters));
        }
Esempio n. 12
0
        protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List <object> output)
        {
            IBufferReader reader  = NettyBufferManager.CreateBufferReader(input);
            InvokeMessage message = this._codecs.Decode(reader);

            if (message != null)
            {
                output.Add(message);
            }
            reader = null;
        }
Esempio n. 13
0
        /// <summary>
        /// 调用分布式服务
        /// </summary>
        /// <param name="nodeKey"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public InvokeData Invoke(string nodeKey, InvokeMessage message)
        {
            nodeKey = GetNodeKey(nodeKey);
            var node = GetServerNodes().FirstOrDefault(p => string.Compare(p.Key, nodeKey, true) == 0);

            if (node == null)
            {
                throw new WarningException(string.Format("Did not find the node {0}!", nodeKey));
            }

            return(Invoke(node, message));
        }
Esempio n. 14
0
        private void button1_Click(object sender, EventArgs e)
        {
            if (txtParameters.Count > 0)
            {
                if (MessageBox.Show("请确认参数是否全部填写正确!", "系统提示",
                                    MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.Cancel)
                {
                    return;
                }
            }

            button1.Enabled = false;

            label5.Text = "正在调用服务,请稍候...";
            label5.Refresh();

            var jValue = new JObject();

            if (txtParameters.Count > 0)
            {
                foreach (var p in txtParameters)
                {
                    var text = p.Value.Text.Trim();
                    if (!string.IsNullOrEmpty(text))
                    {
                        var info = p.Value.Tag as ParameterInfo;

                        try
                        {
                            jValue[p.Key] = JToken.Parse(text);
                        }
                        catch
                        {
                            jValue[p.Key] = text;
                        }
                    }
                }
            }

            //提交的参数信息
            string parameter = jValue.ToString(Newtonsoft.Json.Formatting.None);
            var    message   = new InvokeMessage
            {
                ServiceName = serviceName,
                MethodName  = methodName,
                Parameters  = parameter
            };

            //启用线程进行数据填充
            var caller = new AsyncMethodCaller(AsyncCaller);
            var ar     = caller.BeginInvoke(message, AsyncComplete, caller);
        }
Esempio n. 15
0
        /// <summary>
        /// 调用分布式服务
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        public InvokeData Invoke(InvokeMessage message)
        {
            if (proxies.Count == 0)
            {
                //获取本地服务
                IService service = GetLocalService(message);
                if (service != null)
                {
                    return(GetInvokeData(message, service));
                }

                throw new WarningException(string.Format("Did not find the service {0}!", message.ServiceName));
            }

            return(Invoke(config.Default, message));
        }
Esempio n. 16
0
        public async Task SendMessage(InvokeMessage message)
        {
            await semaphoreSlim.WaitAsync();

            try
            {
                logger.LogDebug($"sending message {message.Id}");
                var streamToOut = EncodeMessage(message);
                streamToOut.Position = 0;
                await streamToOut.CopyToAsync(tcpClient.GetStream());
            }
            finally
            {
                semaphoreSlim.Release();
            }
        }
Esempio n. 17
0
 /// <summary>
 /// 订阅报警记录,返回报警ID,返回-1表示调用失败
 /// </summary>
 /// <returns></returns>
 public long SubscribeAlarm()
 {
     try
     {
         var msg = new InvokeMessage(MethodType.Alarm, "SubscribeAlarm");
         var res = Invoke(msg);
         if (!res.IsSuccess)
         {
             return(-1);
         }
         return(Convert.ToInt64(res.ReturnBody));
     }
     catch (Exception ex)
     {
         return(-1);
     }
 }
Esempio n. 18
0
 /// <summary>
 /// 通过订阅ID获取报警记录集合
 /// </summary>
 /// <param name="id"></param>
 /// <returns></returns>
 public List <AlarmRecord> GetAlarms(long id)
 {
     try
     {
         var msg = new InvokeMessage(MethodType.Alarm, "GetAlarmRecords");
         msg.Paras = new dynamic[] { id };
         var res = Invoke(msg);
         if (!res.IsSuccess)
         {
             return(null);
         }
         return(JsonDeserialize <List <AlarmRecord> >(res.ReturnBody));
     }
     catch (Exception ex)
     {
         return(null);
     }
 }
Esempio n. 19
0
 /// <summary>
 /// 通过id取消订阅报警
 /// </summary>
 /// <param name="id"></param>
 /// <returns></returns>
 public bool RemoverSubscribeAlarm(long id)
 {
     try
     {
         var msg = new InvokeMessage(MethodType.Alarm, "RemoveSubcribe");
         msg.Paras = new dynamic[] { id };
         var res = Invoke(msg);
         if (!res.IsSuccess)
         {
             return(false);
         }
         return(Convert.ToBoolean(res.ReturnBody));
     }
     catch (Exception)
     {
         return(false);
     }
 }
Esempio n. 20
0
        private async Task LocalExecute(InvokeMessage invokeMessage, ResultMessage result)
        {
            try
            {
                _logger.LogDebug(JsonConvert.SerializeObject(invokeMessage));
                var service    = _entryFactory.Find(invokeMessage.ServiceId);
                var args       = new List <object>();
                var parameters = invokeMessage.Parameters ?? new Dictionary <string, object>();
                foreach (var parameter in service.GetParameters())
                {
                    if (parameters.ContainsKey(parameter.Name))
                    {
                        var parameterType = parameter.ParameterType;
                        var arg           = parameters[parameter.Name].CastTo(parameterType);
                        args.Add(arg);
                    }
                    else
                    {
                        args.Add(parameter.DefaultValue);
                    }
                }

                var instance = _provider.GetService(service.DeclaringType);
                var data     = service.Invoke(instance, args.ToArray());
                if (!(data is Task task))
                {
                    result.Data = data;
                }
                else
                {
                    await task;
                    var   taskType = task.GetType().GetTypeInfo();
                    if (taskType.IsGenericType)
                    {
                        var prop = taskType.GetProperty("Result");
                        if (prop != null)
                        {
                            result.Data = prop.GetValue(task);
                        }
                    }
                }
            }
Esempio n. 21
0
        private InvokeMessage Create(MethodInfo targetMethod, IDictionary <string, object> args)
        {
            var localIp = Constants.LocalIp();
            var headers = new Dictionary <string, string>
            {
                { MicroClaimTypes.HeaderForward, localIp },
                { MicroClaimTypes.HeaderRealIp, localIp },
                { MicroClaimTypes.HeaderUserAgent, "spear-client" }
                //{MicroClaimTypes.HeaderReferer, string.Empty}
            };
            var session = _provider.GetService <IMicroSession>();

            if (session != null)
            {
                if (session.UserId != null)
                {
                    headers.Add(MicroClaimTypes.HeaderUserId, session.GetUserId <string>());
                    headers.Add(MicroClaimTypes.HeaderUserName,
                                HttpUtility.UrlEncode(session.UserName ?? string.Empty));
                    headers.Add(MicroClaimTypes.HeaderRole, HttpUtility.UrlEncode(session.Role ?? string.Empty));
                }

                if (session.TenantId != null)
                {
                    headers.Add(MicroClaimTypes.HeaderTenantId, session.GetTenantId <string>());
                }
            }
            var serviceId     = targetMethod.ServiceKey();
            var invokeMessage = new InvokeMessage
            {
                ServiceId  = serviceId,
                Parameters = args,
                Headers    = headers
            };
            var type = targetMethod.ReturnType;

            if (type == typeof(void) || type == typeof(Task))
            {
                invokeMessage.IsNotice = true;
            }
            return(invokeMessage);
        }
Esempio n. 22
0
        /// <summary>
        /// 获取本地服务
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        private IService GetLocalService(InvokeMessage message)
        {
            IService service    = null;
            string   serviceKey = "Service_" + message.ServiceName;

            if (config.Type != CastleFactoryType.Remote)
            {
                if (container.Kernel.HasComponent(serviceKey))
                {
                    service = container.Resolve <IService>(serviceKey);
                }

                if (service == null && config.Type == CastleFactoryType.Local)
                {
                    throw new WarningException(string.Format("Local not find service ({0}).", message.ServiceName));
                }
            }

            return(service);
        }
Esempio n. 23
0
        private static InvokeMessage Create(MethodInfo targetMethod, object[] args)
        {
            var remoteIp = AcbHttpContext.RemoteIpAddress;
            var headers  = new Dictionary <string, string>
            {
                { "X-Forwarded-For", remoteIp },
                { "X-Real-IP", remoteIp },
                {
                    "User-Agent", AcbHttpContext.Current == null ? "micro_service_client" : AcbHttpContext.UserAgent
                },
                { "referer", AcbHttpContext.RawUrl }
            };
            var methodType = targetMethod.DeclaringType;
            var serviceId  = $"{methodType?.FullName}.{targetMethod.Name}";
            var dict       = new Dictionary <string, object>();
            var parameters = targetMethod.GetParameters();

            if (parameters.Any())
            {
                for (var i = 0; i < parameters.Length; i++)
                {
                    dict.Add(parameters[i].Name, args[i]);
                }

                serviceId += "_" + string.Join("_", parameters.Select(i => i.Name));
            }

            var invokeMessage = new InvokeMessage
            {
                ServiceId  = serviceId,
                Parameters = dict,
                Headers    = headers
            };
            var type = targetMethod.ReturnType;

            if (type == typeof(void) || type == typeof(Task))
            {
                invokeMessage.IsNotice = true;
            }
            return(invokeMessage);
        }
Esempio n. 24
0
        private InvokeMessage DecodeMessage(MemoryStream contentStream, Guid id)
        {
            InvokeMessage message = new InvokeMessage();

            using (var reader = new BinaryReader(contentStream, Encoding.UTF8))
            {
                message.Id          = id;
                message.SubObjectId = reader.ReadInt64();
                message.MethodName  = reader.ReadString();
                message.Args        = JsonConvert.DeserializeObject <Dictionary <string, Value> >(reader.ReadString());
                message.Streams     = new Dictionary <string, Stream>();
                while (contentStream.Position != contentStream.Length)
                {
                    var streamName  = reader.ReadString();
                    var size        = (int)reader.ReadInt64();
                    var innerStream = new MemoryStream();
                    contentStream.CopyPart(innerStream, size).Wait();
                    innerStream.Position        = 0;
                    message.Streams[streamName] = innerStream;
                }
            }
            return(message);
        }
Esempio n. 25
0
        private static InvokeMessage Create(MethodInfo targetMethod, IDictionary <string, object> args)
        {
            var remoteIp = Constants.LocalIp();
            var headers  = new Dictionary <string, string>
            {
                { "X-Forwarded-For", remoteIp },
                { "X-Real-IP", remoteIp },
                { "User-Agent", "spear-client" }
            };
            var serviceId     = targetMethod.ServiceKey();
            var invokeMessage = new InvokeMessage
            {
                ServiceId  = serviceId,
                Parameters = args,
                Headers    = headers
            };
            var type = targetMethod.ReturnType;

            if (type == typeof(void) || type == typeof(Task))
            {
                invokeMessage.IsNotice = true;
            }
            return(invokeMessage);
        }
Esempio n. 26
0
        private object[] GetArguments(InvokeMessage message, Func <long, Type, object> hardbjectFor, MethodInfo methodInfo)
        {
            var args = new List <object>();

            foreach (var param in methodInfo.GetParameters())
            {
                if (message.Args.TryGetValue(param.Name, out var token))
                {
                    switch (token.Type)
                    {
                    case Messages.ValueType.Null:
                        args.Add(null);
                        break;

                    case Messages.ValueType.Primitive:
                        args.Add(token.Data.ToObject(param.ParameterType));
                        break;

                    case Messages.ValueType.HardObject:
                        args.Add(hardbjectFor(token.Data.ToObject <long>(),
                                              param.ParameterType));
                        break;
                    }
                }
                else
                if (message.Streams.TryGetValue(param.Name, out var stream))
                {
                    args.Add(stream);
                }
                else
                {
                    throw new Exception($"Parameter {param.Name} was not found in InvokeMessage");
                }
            }
            return(args.ToArray());
        }
Esempio n. 27
0
        private InvokeResult GetInvokationResult(InvokeMessage message)
        {
            object data;

            try
            {
                data = invoker.Invoke(message, CreateRemoteInvoker);
            }
            catch (Exception ex)
            {
                return(InvokeResult.Exception(message.Id, ex));
            }
            if (data == null)
            {
                return(InvokeResult.Null(message.Id));
            }
            if (data is Stream stream)
            {
                return(InvokeResult.Stream(message.Id, stream));
            }
            if (PrimitiveTypes.Contains(data.GetType()))
            {
                return(InvokeResult.Primitive(message.Id, JToken.FromObject(data)));
            }

            var  codeInvoker = new CodeInvoker(data, data.GetType());
            long newId;

            //TODO lock need?
            lock (subWrappers)
            {
                newId = ++lastId;
                subWrappers[newId] = new InstanceWrapper(codeInvoker);
            }
            return(InvokeResult.HardObject(message.Id, newId));
        }
Esempio n. 28
0
        private async Task LocalExecute(InvokeMessage invokeMessage, ResultMessage result)
        {
            try
            {
                if (_logger.IsEnabled(LogLevel.Debug))
                {
                    _logger.LogDebug(JsonConvert.SerializeObject(invokeMessage));
                }
                var entry = _entryFactory.Find(invokeMessage.ServiceId);

                if (entry.IsNotify)
                {
                    await entry.Invoke(invokeMessage.Parameters);
                }
                else
                {
                    var data = await entry.Invoke(invokeMessage.Parameters);

                    if (!(data is Task task))
                    {
                        result.Data = data;
                    }
                    else
                    {
                        await task;
                        var   taskType = task.GetType().GetTypeInfo();
                        if (taskType.IsGenericType)
                        {
                            var prop = taskType.GetProperty("Result");
                            if (prop != null)
                            {
                                result.Data = prop.GetValue(task);
                            }
                        }
                    }
                }
Esempio n. 29
0
        /// <summary> 执行请求 </summary>
        /// <param name="serviceAddress"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        private async Task <ResultMessage> ClientInvokeAsync(ServiceAddress serviceAddress, InvokeMessage message)
        {
            //获取不同协议的客户端工厂
            var clientFactory = _provider.GetService <IMicroClientFactory>(serviceAddress.Protocol);
            var client        = clientFactory.CreateClient(serviceAddress);
            var result        = await client.Send(message);

            return(result);
        }
Esempio n. 30
0
        /// <summary>
        /// 调用服务,并返回字符串
        /// </summary>
        /// <param name="name"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public string CallMethod(string name, string parameters)
        {
            if (callers.ContainsKey(name))
            {
                var caller  = callers[name];
                var message = new InvokeMessage
                {
                    ServiceName = caller.Service.FullName,
                    MethodName  = caller.Method.ToString(),
                    Parameters  = parameters
                };

                string thisKey  = string.Format("{0}${1}${2}", message.ServiceName, message.MethodName, message.Parameters);
                var    cacheKey = string.Format("HttpServiceCaller_{0}", IoCHelper.GetMD5String(thisKey));

                var invokeData = CacheHelper.Get <InvokeData>(cacheKey);
                if (invokeData == null)
                {
                    //获取当前调用者信息
                    var appCaller = new AppCaller
                    {
                        AppPath     = AppDomain.CurrentDomain.BaseDirectory,
                        AppName     = "HttpServer",
                        HostName    = DnsHelper.GetHostName(),
                        IPAddress   = DnsHelper.GetIPAddress(),
                        ServiceName = message.ServiceName,
                        MethodName  = message.MethodName,
                        Parameters  = message.Parameters,
                        CallTime    = DateTime.Now
                    };

                    //创建服务
                    var service = CreateService(appCaller);

                    //初始化上下文
                    SetOperationContext(appCaller);

                    try
                    {
                        //使用Invoke方式调用
                        var invoke = new InvokeCaller(appCaller.AppName, service);
                        invokeData = invoke.CallMethod(message);

                        //插入缓存
                        if (invokeData != null && caller.CacheTime > 0)
                        {
                            CacheHelper.Insert(cacheKey, invokeData, caller.CacheTime);
                        }
                    }
                    finally
                    {
                        //初始化上下文
                        OperationContext.Current = null;
                    }
                }

                //如果缓存不为null,则返回缓存数据
                if (invokeData != null)
                {
                    return(invokeData.Value);
                }
            }

            return("null");
        }