Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
 /// <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);
     }
 }
Beispiel #3
0
        /// <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();
            }
        }