/// <summary> /// 初始化参数与头部信息 /// </summary> /// <param name="request"></param> /// <param name="headers"></param> /// <param name="input"></param> private void RequestInit(Method method, RestRequest request, Dictionary <string, string> headers, MNSRequest input) { if (!headers.ContainsKey(HeaderConst.HOST)) { headers[HeaderConst.HOST] = this.host; } if (!headers.ContainsKey(HeaderConst.DATE)) { headers[HeaderConst.DATE] = DateTime.Now.ToUniversalTime().ToString("r"); headers[HeaderConst.X_MNS_DATE] = DateTime.Now.ToUniversalTime().ToString("r"); } if (!headers.ContainsKey(HeaderConst.MQVERSION)) { headers[HeaderConst.MQVERSION] = this.version; } //如果request不为空,需指定content-type,否则签名无法通过 if (input != null) { headers[HeaderConst.CONTENTTYPE] = "text/xml"; } //headers[HeaderConst.CONTENTMD5] =m headers[HeaderConst.AUTHORIZATION] = Authorization(method, headers, request.Resource); foreach (var kv in headers) { request.AddHeader(kv.Key, kv.Value); } if (input != null) { request.AddBody(input); } }
/// <summary> /// 同步执行api /// </summary> /// <typeparam name="TR"></typeparam> /// <param name="method"></param> /// <param name="resource"></param> /// <param name="headers"></param> /// <param name="input"></param> /// <returns></returns> internal TR Execute <TR>(Method method, string resource, Dictionary <string, string> headers, MNSRequest input = null) where TR : MNSResponse, new() { //var restClient = new RestClient(this.url); var request = new RestRequest(resource, this.Map(method)) { RequestFormat = DataFormat.Xml }; this.RequestInit(method, request, headers, input); var task = new TaskCompletionSource <TR>(); var responseasync = restClient.ExecuteAsync <TR>(request, response => { if (response.Data != null) { task.SetResult(response.Data); } else if (response.StatusCode == System.Net.HttpStatusCode.OK || response.StatusCode == System.Net.HttpStatusCode.NoContent) { task.SetResult(null); } else if (response.StatusCode == HttpStatusCode.Created) { task.SetResult(null); } else { ; task.SetException(new MNSRequestException(string.Format("{0}:{1}", response.StatusCode, response.ErrorMessage))); } }); Task.WaitAll(task.Task); return(task.Task.Result); }
/// <summary> /// 异步执行api,主用用在popmessage上,当queue的长轮询等待时间大于0时可以非阻塞执行代码 /// </summary> /// <typeparam name="TR"></typeparam> /// <param name="method"></param> /// <param name="resource"></param> /// <param name="headers"></param> /// <param name="callBack"></param> /// <param name="input"></param> internal void ExecuteAsync <TR>(Method method, string resource, Dictionary <string, string> headers, Action <TR> callBack, MNSRequest input = null) where TR : MNSResponse, new() { //var restClient = new RestClient(this.url); var request = new RestRequest(resource, this.Map(method)) { RequestFormat = DataFormat.Xml }; this.RequestInit(method, request, headers, input); restClient.ExecuteAsync <TR>(request, IRR => { callBack(IRR.Data); }); }