/// <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"; }
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; }
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); }