public Dictionary DoRequest()

in csharp/core/Client.cs [1730:2021]


        public Dictionary<string, object> DoRequest(Params params_, OpenApiRequest request, AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime)
        {
            params_.Validate();
            request.Validate();
            Dictionary<string, object> runtime_ = new Dictionary<string, object>
            {
                {"timeouted", "retry"},
                {"key", AlibabaCloud.TeaUtil.Common.DefaultString(runtime.Key, _key)},
                {"cert", AlibabaCloud.TeaUtil.Common.DefaultString(runtime.Cert, _cert)},
                {"ca", AlibabaCloud.TeaUtil.Common.DefaultString(runtime.Ca, _ca)},
                {"readTimeout", AlibabaCloud.TeaUtil.Common.DefaultNumber(runtime.ReadTimeout, _readTimeout)},
                {"connectTimeout", AlibabaCloud.TeaUtil.Common.DefaultNumber(runtime.ConnectTimeout, _connectTimeout)},
                {"httpProxy", AlibabaCloud.TeaUtil.Common.DefaultString(runtime.HttpProxy, _httpProxy)},
                {"httpsProxy", AlibabaCloud.TeaUtil.Common.DefaultString(runtime.HttpsProxy, _httpsProxy)},
                {"noProxy", AlibabaCloud.TeaUtil.Common.DefaultString(runtime.NoProxy, _noProxy)},
                {"socks5Proxy", AlibabaCloud.TeaUtil.Common.DefaultString(runtime.Socks5Proxy, _socks5Proxy)},
                {"socks5NetWork", AlibabaCloud.TeaUtil.Common.DefaultString(runtime.Socks5NetWork, _socks5NetWork)},
                {"maxIdleConns", AlibabaCloud.TeaUtil.Common.DefaultNumber(runtime.MaxIdleConns, _maxIdleConns)},
                {"retry", new Dictionary<string, object>
                {
                    {"retryable", runtime.Autoretry},
                    {"maxAttempts", AlibabaCloud.TeaUtil.Common.DefaultNumber(runtime.MaxAttempts, 3)},
                }},
                {"backoff", new Dictionary<string, object>
                {
                    {"policy", AlibabaCloud.TeaUtil.Common.DefaultString(runtime.BackoffPolicy, "no")},
                    {"period", AlibabaCloud.TeaUtil.Common.DefaultNumber(runtime.BackoffPeriod, 1)},
                }},
                {"ignoreSSL", runtime.IgnoreSSL},
            };

            TeaRequest _lastRequest = null;
            Exception _lastException = null;
            long _now = System.DateTime.Now.Millisecond;
            int _retryTimes = 0;
            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
            {
                if (_retryTimes > 0)
                {
                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
                    if (backoffTime > 0)
                    {
                        TeaCore.Sleep(backoffTime);
                    }
                }
                _retryTimes = _retryTimes + 1;
                try
                {
                    TeaRequest request_ = new TeaRequest();
                    request_.Protocol = AlibabaCloud.TeaUtil.Common.DefaultString(_protocol, params_.Protocol);
                    request_.Method = params_.Method;
                    request_.Pathname = params_.Pathname;
                    Dictionary<string, string> globalQueries = new Dictionary<string, string>(){};
                    Dictionary<string, string> globalHeaders = new Dictionary<string, string>(){};
                    if (!AlibabaCloud.TeaUtil.Common.IsUnset(_globalParameters))
                    {
                        GlobalParameters globalParams = _globalParameters;
                        if (!AlibabaCloud.TeaUtil.Common.IsUnset(globalParams.Queries))
                        {
                            globalQueries = globalParams.Queries;
                        }
                        if (!AlibabaCloud.TeaUtil.Common.IsUnset(globalParams.Headers))
                        {
                            globalHeaders = globalParams.Headers;
                        }
                    }
                    Dictionary<string, string> extendsHeaders = new Dictionary<string, string>(){};
                    Dictionary<string, string> extendsQueries = new Dictionary<string, string>(){};
                    if (!AlibabaCloud.TeaUtil.Common.IsUnset(runtime.ExtendsParameters))
                    {
                        AlibabaCloud.TeaUtil.Models.ExtendsParameters extendsParameters = runtime.ExtendsParameters;
                        if (!AlibabaCloud.TeaUtil.Common.IsUnset(extendsParameters.Headers))
                        {
                            extendsHeaders = extendsParameters.Headers;
                        }
                        if (!AlibabaCloud.TeaUtil.Common.IsUnset(extendsParameters.Queries))
                        {
                            extendsQueries = extendsParameters.Queries;
                        }
                    }
                    request_.Query = TeaConverter.merge<string>
                    (
                        globalQueries,
                        extendsQueries,
                        request.Query
                    );
                    // endpoint is setted in product client
                    request_.Headers = TeaConverter.merge<string>
                    (
                        new Dictionary<string, string>()
                        {
                            {"host", _endpoint},
                            {"x-acs-version", params_.Version},
                            {"x-acs-action", params_.Action},
                            {"user-agent", GetUserAgent()},
                            {"x-acs-date", AlibabaCloud.OpenApiUtil.Client.GetTimestamp()},
                            {"x-acs-signature-nonce", AlibabaCloud.TeaUtil.Common.GetNonce()},
                            {"accept", "application/json"},
                        },
                        globalHeaders,
                        extendsHeaders,
                        request.Headers
                    );
                    if (AlibabaCloud.TeaUtil.Common.EqualString(params_.Style, "RPC"))
                    {
                        Dictionary<string, string> headers = GetRpcHeaders();
                        if (!AlibabaCloud.TeaUtil.Common.IsUnset(headers))
                        {
                            request_.Headers = TeaConverter.merge<string>
                            (
                                request_.Headers,
                                headers
                            );
                        }
                    }
                    string signatureAlgorithm = AlibabaCloud.TeaUtil.Common.DefaultString(_signatureAlgorithm, "ACS3-HMAC-SHA256");
                    string hashedRequestPayload = AlibabaCloud.OpenApiUtil.Client.HexEncode(AlibabaCloud.OpenApiUtil.Client.Hash(AlibabaCloud.TeaUtil.Common.ToBytes(""), signatureAlgorithm));
                    if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.Stream))
                    {
                        byte[] tmp = AlibabaCloud.TeaUtil.Common.ReadAsBytes(request.Stream);
                        hashedRequestPayload = AlibabaCloud.OpenApiUtil.Client.HexEncode(AlibabaCloud.OpenApiUtil.Client.Hash(tmp, signatureAlgorithm));
                        request_.Body = TeaCore.BytesReadable(tmp);
                        request_.Headers["content-type"] = "application/octet-stream";
                    }
                    else
                    {
                        if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.Body))
                        {
                            if (AlibabaCloud.TeaUtil.Common.EqualString(params_.ReqBodyType, "byte"))
                            {
                                byte[] byteObj = AlibabaCloud.TeaUtil.Common.AssertAsBytes(request.Body);
                                hashedRequestPayload = AlibabaCloud.OpenApiUtil.Client.HexEncode(AlibabaCloud.OpenApiUtil.Client.Hash(byteObj, signatureAlgorithm));
                                request_.Body = TeaCore.BytesReadable(byteObj);
                            }
                            else if (AlibabaCloud.TeaUtil.Common.EqualString(params_.ReqBodyType, "json"))
                            {
                                string jsonObj = AlibabaCloud.TeaUtil.Common.ToJSONString(request.Body);
                                hashedRequestPayload = AlibabaCloud.OpenApiUtil.Client.HexEncode(AlibabaCloud.OpenApiUtil.Client.Hash(AlibabaCloud.TeaUtil.Common.ToBytes(jsonObj), signatureAlgorithm));
                                request_.Body = TeaCore.BytesReadable(jsonObj);
                                request_.Headers["content-type"] = "application/json; charset=utf-8";
                            }
                            else
                            {
                                Dictionary<string, object> m = AlibabaCloud.TeaUtil.Common.AssertAsMap(request.Body);
                                string formObj = AlibabaCloud.OpenApiUtil.Client.ToForm(m);
                                hashedRequestPayload = AlibabaCloud.OpenApiUtil.Client.HexEncode(AlibabaCloud.OpenApiUtil.Client.Hash(AlibabaCloud.TeaUtil.Common.ToBytes(formObj), signatureAlgorithm));
                                request_.Body = TeaCore.BytesReadable(formObj);
                                request_.Headers["content-type"] = "application/x-www-form-urlencoded";
                            }
                        }
                    }
                    request_.Headers["x-acs-content-sha256"] = hashedRequestPayload;
                    if (!AlibabaCloud.TeaUtil.Common.EqualString(params_.AuthType, "Anonymous"))
                    {
                        if (AlibabaCloud.TeaUtil.Common.IsUnset(_credential))
                        {
                            throw new TeaException(new Dictionary<string, string>
                            {
                                {"code", "InvalidCredentials"},
                                {"message", "Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details."},
                            });
                        }
                        Aliyun.Credentials.Models.CredentialModel credentialModel = this._credential.GetCredential();
                        string authType = credentialModel.Type;
                        if (AlibabaCloud.TeaUtil.Common.EqualString(authType, "bearer"))
                        {
                            string bearerToken = credentialModel.BearerToken;
                            request_.Headers["x-acs-bearer-token"] = bearerToken;
                            if (AlibabaCloud.TeaUtil.Common.EqualString(params_.Style, "RPC"))
                            {
                                request_.Query["SignatureType"] = "BEARERTOKEN";
                            }
                            else
                            {
                                request_.Headers["x-acs-signature-type"] = "BEARERTOKEN";
                            }
                        }
                        else
                        {
                            string accessKeyId = credentialModel.AccessKeyId;
                            string accessKeySecret = credentialModel.AccessKeySecret;
                            string securityToken = credentialModel.SecurityToken;
                            if (!AlibabaCloud.TeaUtil.Common.Empty(securityToken))
                            {
                                request_.Headers["x-acs-accesskey-id"] = accessKeyId;
                                request_.Headers["x-acs-security-token"] = securityToken;
                            }
                            request_.Headers["Authorization"] = AlibabaCloud.OpenApiUtil.Client.GetAuthorization(request_, signatureAlgorithm, hashedRequestPayload, accessKeyId, accessKeySecret);
                        }
                    }
                    _lastRequest = request_;
                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);

                    if (AlibabaCloud.TeaUtil.Common.Is4xx(response_.StatusCode) || AlibabaCloud.TeaUtil.Common.Is5xx(response_.StatusCode))
                    {
                        Dictionary<string, object> err = new Dictionary<string, object>(){};
                        if (!AlibabaCloud.TeaUtil.Common.IsUnset(response_.Headers.Get("content-type")) && AlibabaCloud.TeaUtil.Common.EqualString(response_.Headers.Get("content-type"), "text/xml;charset=utf-8"))
                        {
                            string _str = AlibabaCloud.TeaUtil.Common.ReadAsString(response_.Body);
                            Dictionary<string, object> respMap = AlibabaCloud.TeaXML.Client.ParseXml(_str, null);
                            err = AlibabaCloud.TeaUtil.Common.AssertAsMap(respMap.Get("Error"));
                        }
                        else
                        {
                            object _res = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response_.Body);
                            err = AlibabaCloud.TeaUtil.Common.AssertAsMap(_res);
                        }
                        err["statusCode"] = response_.StatusCode;
                        throw new TeaException(new Dictionary<string, object>
                        {
                            {"code", "" + DefaultAny(err.Get("Code"), err.Get("code"))},
                            {"message", "code: " + response_.StatusCode + ", " + DefaultAny(err.Get("Message"), err.Get("message")) + " request id: " + DefaultAny(err.Get("RequestId"), err.Get("requestId"))},
                            {"data", err},
                            {"description", "" + DefaultAny(err.Get("Description"), err.Get("description"))},
                            {"accessDeniedDetail", DefaultAny(err.Get("AccessDeniedDetail"), err.Get("accessDeniedDetail"))},
                        });
                    }
                    if (AlibabaCloud.TeaUtil.Common.EqualString(params_.BodyType, "binary"))
                    {
                        Dictionary<string, object> resp = new Dictionary<string, object>
                        {
                            {"body", response_.Body},
                            {"headers", response_.Headers},
                            {"statusCode", response_.StatusCode},
                        };
                        return resp;
                    }
                    else if (AlibabaCloud.TeaUtil.Common.EqualString(params_.BodyType, "byte"))
                    {
                        byte[] byt = AlibabaCloud.TeaUtil.Common.ReadAsBytes(response_.Body);
                        return new Dictionary<string, object>
                        {
                            {"body", byt},
                            {"headers", response_.Headers},
                            {"statusCode", response_.StatusCode},
                        };
                    }
                    else if (AlibabaCloud.TeaUtil.Common.EqualString(params_.BodyType, "string"))
                    {
                        string str = AlibabaCloud.TeaUtil.Common.ReadAsString(response_.Body);
                        return new Dictionary<string, object>
                        {
                            {"body", str},
                            {"headers", response_.Headers},
                            {"statusCode", response_.StatusCode},
                        };
                    }
                    else if (AlibabaCloud.TeaUtil.Common.EqualString(params_.BodyType, "json"))
                    {
                        object obj = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response_.Body);
                        Dictionary<string, object> res = AlibabaCloud.TeaUtil.Common.AssertAsMap(obj);
                        return new Dictionary<string, object>
                        {
                            {"body", res},
                            {"headers", response_.Headers},
                            {"statusCode", response_.StatusCode},
                        };
                    }
                    else if (AlibabaCloud.TeaUtil.Common.EqualString(params_.BodyType, "array"))
                    {
                        object arr = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response_.Body);
                        return new Dictionary<string, object>
                        {
                            {"body", arr},
                            {"headers", response_.Headers},
                            {"statusCode", response_.StatusCode},
                        };
                    }
                    else
                    {
                        string anything = AlibabaCloud.TeaUtil.Common.ReadAsString(response_.Body);
                        return new Dictionary<string, object>
                        {
                            {"body", anything},
                            {"headers", response_.Headers},
                            {"statusCode", response_.StatusCode},
                        };
                    }
                }
                catch (Exception e)
                {
                    if (TeaCore.IsRetryable(e))
                    {
                        _lastException = e;
                        continue;
                    }
                    throw e;
                }
            }

            throw new TeaUnretryableException(_lastRequest, _lastException);
        }