public WfServiceInvoker(WfServiceOperationDefinition svcOperationDef, WfApplicationRuntimeParameters invokeContext) { this._SvcOperationDef = svcOperationDef; this._InvokeContext = invokeContext; this.InitConnectionMappings(); this.InitHeaders(); }
private string CreateJsonData(WfApplicationRuntimeParameters context) { string result = string.Empty; if (_SvcOperationDef.Params.Count > 0) { Dictionary<string, object> jsonDict = new Dictionary<string, object>(); Dictionary<string, object> headers = new Dictionary<string, object>(); foreach (string key in this.Headers.AllKeys) headers[key] = this.Headers[key]; jsonDict["__Headers"] = headers; jsonDict["__ConnectionMappings"] = this.ConnectionMappings; foreach (var item in this._SvcOperationDef.Params) { if (item.Type == WfSvcOperationParameterType.RuntimeParameter) { var paraName = item.Value != null ? item.Value.ToString() : string.Empty; if (paraName.IsNullOrEmpty()) paraName = item.Name; //流程运行时参数名与方法参数名相同 var paramValue = context.GetValueRecursively<object>(paraName, null); if (paramValue == null) throw new ArgumentException("未能在CurrentProcess.ApplicationRuntimeParameters中找到参数" + paraName); jsonDict.Add(item.Name, paramValue); } else { jsonDict.Add(item.Name, item.Value); } } WfConverterHelper.RegisterConverters(); result = JSONSerializerExecute.Serialize(jsonDict); } return result; }
/// <summary> /// 构造请求字符串 /// </summary> /// <param name="context"></param> /// <returns></returns> private string CreateQueryString(WfApplicationRuntimeParameters context) { StringBuilder result = new StringBuilder(); foreach (var item in this._SvcOperationDef.Params) { if (result.Length > 0) { result.Append("&"); } result.Append(HttpUtility.UrlEncode(item.Name)); result.Append("="); if (item.Type == WfSvcOperationParameterType.RuntimeParameter) { var paraName = item.Value != null ? item.Value.ToString() : ""; if (string.IsNullOrEmpty(paraName)) paraName = item.Name; //流程运行时参数名与方法参数名相同 string paraVal = context.GetValueRecursively(paraName, string.Empty); result.Append(HttpUtility.UrlEncode(paraVal)); } else { if (item.Value != null) result.Append(HttpUtility.UrlEncode(item.Value.ToString())); } } return result.ToString(); }
private HttpWebRequest CreatePostRequest(TimeSpan timeout, WfApplicationRuntimeParameters context) { HttpWebRequest result = (HttpWebRequest)HttpWebRequest.Create(FormatUrl(_SvcOperationDef.AddressDef.Address, true) + HttpUtility.UrlEncode(_SvcOperationDef.OperationName)); result.Method = "POST"; result.Timeout = (int)timeout.TotalMilliseconds; result.KeepAlive = false; result.ProtocolVersion = HttpVersion.Version10; result.Headers.CopyFrom(this.Headers); string postData = string.Empty; switch (_SvcOperationDef.AddressDef.ContentType) { case WfServiceContentType.Form: result.ContentType = "application/x-www-form-urlencoded"; postData = this.CreateQueryString(context); break; case WfServiceContentType.Json: result.ContentType = "application/json"; postData = this.CreateJsonData(context); break; default: break; } AttachDataToRequest(result, postData); return result; }
private HttpWebRequest CreateGetRequest(TimeSpan timeout, WfApplicationRuntimeParameters context) { string url = string.Concat(FormatUrl(this._SvcOperationDef.AddressDef.Address, true), HttpUtility.UrlEncode(this._SvcOperationDef.OperationName)); string strQuery = this.CreateQueryString(context); if (strQuery.IsNotEmpty()) url = string.Format("{0}?{1}", url, strQuery); HttpWebRequest result = (HttpWebRequest)HttpWebRequest.Create(url); result.Timeout = (int)timeout.TotalMilliseconds; result.Method = "GET"; result.ContentType = "text/xml"; result.KeepAlive = false; result.ProtocolVersion = HttpVersion.Version10; result.Headers.CopyFrom(this.Headers); return result; }
private HttpWebRequest GenerateWebRequestObj(TimeSpan timeout, WfApplicationRuntimeParameters context) { ExceptionHelper.TrueThrow(string.IsNullOrEmpty(this._SvcOperationDef.AddressDef.Address), "服务地址定义不能为空."); ExceptionHelper.TrueThrow(string.IsNullOrEmpty(this._SvcOperationDef.OperationName), "调用方法名称不能为空."); HttpWebRequest request; switch (this._SvcOperationDef.AddressDef.RequestMethod) { case WfServiceRequestMethod.Get: request = this.CreateGetRequest(timeout, context); break; case WfServiceRequestMethod.Post: request = this.CreatePostRequest(timeout, context); break; case WfServiceRequestMethod.Soap: request = this.CreateSoapRequest(timeout); break; default: throw new NotImplementedException(); }; if (this._SvcOperationDef.AddressDef.Credential != null) request.Credentials = (NetworkCredential)this._SvcOperationDef.AddressDef.Credential; return request; }
/// <summary> /// 调用服务 /// </summary> /// <param name="timeout">请求超时时间,单位毫秒</param> /// <param name="context">上下文参数</param> /// <returns></returns> public object Invoke(TimeSpan timeout, WfApplicationRuntimeParameters context) { try { if (context == null) context = WfServiceInvoker.InvokeContext; HttpWebRequest request = GenerateWebRequestObj(timeout, context); try { using (WebResponse response = request.GetResponse()) { using (Stream stream = response.GetResponseStream()) { object result = null; if (stream != null) { StreamReader streamReader = new StreamReader(stream, Encoding.UTF8); string rtnContent = streamReader.ReadToEnd(); result = ParseServiceResultToObject(rtnContent); if (result == null) { result = ExceptionHelper.DoSilentFunc(() => JSONSerializerExecute.DeserializeObject(rtnContent), rtnContent); if (result is WfErrorDTO) { string errorMessage = ((WfErrorDTO)result).ToString() + Environment.NewLine + request.RequestUri.ToString(); throw new WfServiceInvokeException(((WfErrorDTO)result).ToString()); } } } if (this._SvcOperationDef.RtnXmlStoreParamName.IsNotEmpty()) context[this._SvcOperationDef.RtnXmlStoreParamName] = result; return result; } } } catch (WebException ex) { if (ex.Response == null) throw new WfServiceInvokeException(string.Format("调用服务时发生了异常,{0},但无响应内容。HTTP状态为{1}", ex.Message, ex.Status), ex); else throw WfServiceInvokeException.FromWebResponse(ex.Response); } } catch (WebException ex) { throw new WfServiceInvokeException(ex.Message, ex); } }
/// <summary> /// 调用服务,默认超时30秒 /// </summary> /// <param name="context"></param> /// <returns></returns> public object Invoke(WfApplicationRuntimeParameters context) { return Invoke(this._SvcOperationDef.Timeout, context); }