Ejemplo n.º 1
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;
        }
        /// <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";
        }
Ejemplo n.º 3
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;
        }
Ejemplo n.º 4
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);
        }