예제 #1
0
        public virtual IDictionary <string, object> Execute(OperationConfig config, OperationMetadata metadata, BaseObject requestMap)
        {
            RestyRequest            request;
            CryptographyInterceptor interceptor;
            IRestClient             restClient;

            try {
                request     = this.GetRequest(config, metadata, requestMap);
                interceptor = request.interceptor;
                if (this.restClient != null)
                {
                    restClient         = this.restClient;
                    restClient.BaseUrl = request.BaseUrl;
                }
                else
                {
                    restClient = new RestClient(request.BaseUrl);
                }
            } catch (Exception ex) {
                throw new ApiException(ex.Message, ex);
            }
            IRestResponse restResponse;

            try {
                ApiController.log.Debug(string.Concat(new object[]
                {
                    ">>Execute(action='",
                    config.Action,
                    "', resourcePaht='",
                    config.ResourcePath,
                    "', requestMap='",
                    requestMap,
                    "'"
                }));
                ApiController.log.Debug("excute(), request.Method='" + request.Method + "'");
                ApiController.log.Debug("excute(), request.URL=" + request.AbsoluteUrl.ToString());
                ApiController.log.Debug("excute(), request.Header=");
                ApiController.log.Debug(request.Parameters.Where(x => x.Type == ParameterType.HttpHeader));
                ApiController.log.Debug("excute(), request.Body=");
                ApiController.log.Debug(request.Parameters.Where(x => x.Type == ParameterType.RequestBody));


                restClient.UseSynchronizationContext = true;
#if NET461
                System.Net.ServicePointManager.Expect100Continue       = false;
                System.Net.ServicePointManager.MaxServicePointIdleTime = 5000;
                //System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
                restResponse = restClient.Execute(request);
#elif NETSTANDARD1_6
                restResponse = AsyncHelpers.RunSync(async() => {
                    return(await restClient.ExecuteRequestAsync(request));
                },
                                                    () => {
                    this._apiConfig?.getDoEvents()?.Invoke();
                    return(Task.FromResult(0));
                });
#endif
                ApiController.log.Debug("Execute(), response.Header=");
                ApiController.log.Debug(restResponse.Headers);
                ApiController.log.Debug("Execute(), response.Body=");
                ApiController.log.Debug(restResponse.Content.ToString());
            } catch (Exception ex3) {
                Exception ex2 = new ApiCommunicationException(ex3.Message, ex3);
                ApiController.log.Error(ex2.Message, ex2);
                throw ex2;
            }
            if (restResponse.ErrorException != null || restResponse.Content == null)
            {
                Exception ex4 = new MasterCard.Core.Exceptions.SystemException(restResponse.ErrorMessage, restResponse.ErrorException);
                ApiController.log.Error(ex4.Message, ex4);
                throw ex4;
            }
            IDictionary <string, object> dictionary = null;
            if (restResponse.Content.StartsWith("{") || restResponse.Content.StartsWith("[") || restResponse.ContentType == "application/json")
            {
                try {
                    dictionary = RequestMap.AsDictionary(restResponse.Content);
                    if (interceptor != null)
                    {
                        dictionary = interceptor.Encrypt(dictionary);
                    }
                } catch (Exception) {
                    throw new MasterCard.Core.Exceptions.SystemException("Error: parsing JSON response", restResponse.Content);
                }
            }
            else if (restResponse.Content.StartsWith("<") || restResponse.ContentType == "application/xml")
            {
                try {
                    dictionary = RequestMap.AsDictionaryFromXml(restResponse.Content);
                    if (interceptor != null)
                    {
                        dictionary = interceptor.Encrypt(dictionary);
                    }
                } catch (Exception) {
                    throw new MasterCard.Core.Exceptions.SystemException("Error: parsing XML response", restResponse.Content);
                }
            }
            if (restResponse.StatusCode < HttpStatusCode.MultipleChoices)
            {
                ApiController.log.Debug("<<Execute()");
                return(dictionary);
            }
            try {
                ApiController.ThrowException(dictionary, restResponse);
            } catch (Exception ex5) {
                ApiController.log.Error(ex5.Message, ex5);
                throw ex5;
            }
            return(null);
        }