/// <summary> 请求是否成功 </summary> /// <param name="data"></param> /// <returns></returns> protected virtual bool IsSuccess(SdkRequestData data) { if (data == null || data.Exception != null || data.Code != (int)HttpStatusCode.OK) { return(false); } var t = Json <SdkResult>(data.Result); return(t?.Status ?? false); }
/// <summary> 请求结果 </summary> /// <param name="result"></param> /// <returns></returns> protected virtual async Task OnResult(SdkRequestData result) { if (OnError == null || !IsSuccess(result)) { return; } if (OnError != null) { await OnError(result); } }
/// <summary> 发起请求 </summary> /// <param name="dto"></param> /// <returns></returns> public async Task <SdkResponseDto> RequestAsync(SdkRequestDto dto) { if (dto.Param != null) { var query = dto.Param.Stringfy(encoding: Encoding.UTF8); dto.Api += $"?{query}"; } var uri = new Uri(new Uri(_gateway), dto.Api); var result = new SdkRequestData { Url = uri.AbsoluteUri, Method = dto.Method, Content = dto.Data, Headers = new Dictionary <string, string>() }; HttpWebResponse resp = null; try { var req = (HttpWebRequest)WebRequest.Create(uri); OnRequest?.Invoke(req); req.AllowAutoRedirect = true; req.Method = dto.Method; req.Timeout = 150 * 1000; foreach (var header in _defaultHeaders) { req.Headers.Add(header.Key, header.Value); } if (dto.Headers != null && dto.Headers.ContainsKey("UserAgent")) { req.UserAgent = dto.Headers["UserAgent"]; dto.Headers.Remove("UserAgent"); } else { req.UserAgent = "SDK Request"; } if (dto.Headers != null && dto.Headers.Any()) { foreach (var header in dto.Headers) { req.Headers.Add(header.Key, header.Value); } } foreach (var key in req.Headers.AllKeys) { if (!result.Headers.ContainsKey(key) && !_defaultHeaders.Keys.Contains(key)) { result.Headers.Add(key, req.Headers.Get(key)); } } if (dto.Data != null) { var reqStream = req.GetRequestStream(); switch (dto.ContentType) { case ContentType.Xml: req.ContentType = "text/xml"; var serializer = new XmlSerializer(dto.Data.GetType()); serializer.Serialize(reqStream, dto.Data); break; case ContentType.Form: req.ContentType = "application/x-www-form-urlencoded"; var content = dto.Data.Stringfy(false); var buffer = Encoding.UTF8.GetBytes(content); await reqStream.WriteAsync(buffer, 0, buffer.Length); break; default: req.ContentType = "application/json"; var json = JsonHelper.ToJson(dto.Data); var jsonBuffer = Encoding.UTF8.GetBytes(json); await reqStream.WriteAsync(jsonBuffer, 0, jsonBuffer.Length); break; } } resp = (HttpWebResponse)req.GetResponse(); var respDto = new SdkResponseDto { Code = resp.StatusCode, ContentType = resp.Headers["Content-Type"] }; result.Code = (int)resp.StatusCode; var stream = resp.GetResponseStream(); if (stream != null) { if (string.Equals("gzip", resp.ContentEncoding, StringComparison.CurrentCultureIgnoreCase)) { stream = new GZipStream(stream, CompressionMode.Decompress); } respDto.Content = stream; result.Result = respDto.Result; } return(respDto); } catch (Exception ex) { result.Exception = ex; throw; } finally { OnResult?.Invoke(result); resp.Dispose(); } }