public Dictionary DoRPCRequest()

in csharp/core/Client.cs [132:398]


        public Dictionary<string, object> DoRPCRequest(string action, string version, string protocol, string method, string authType, string bodyType, OpenApiRequest request, AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime)
        {
            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, protocol);
                    request_.Method = method;
                    request_.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>
                    (
                        new Dictionary<string, string>()
                        {
                            {"Action", action},
                            {"Format", "json"},
                            {"Version", version},
                            {"Timestamp", AlibabaCloud.OpenApiUtil.Client.GetTimestamp()},
                            {"SignatureNonce", AlibabaCloud.TeaUtil.Common.GetNonce()},
                        },
                        globalQueries,
                        extendsQueries,
                        request.Query
                    );
                    Dictionary<string, string> headers = GetRpcHeaders();
                    if (AlibabaCloud.TeaUtil.Common.IsUnset(headers))
                    {
                        // endpoint is setted in product client
                        request_.Headers = TeaConverter.merge<string>
                        (
                            new Dictionary<string, string>()
                            {
                                {"host", _endpoint},
                                {"x-acs-version", version},
                                {"x-acs-action", action},
                                {"user-agent", GetUserAgent()},
                            },
                            globalHeaders,
                            extendsHeaders
                        );
                    }
                    else
                    {
                        request_.Headers = TeaConverter.merge<string>
                        (
                            new Dictionary<string, string>()
                            {
                                {"host", _endpoint},
                                {"x-acs-version", version},
                                {"x-acs-action", action},
                                {"user-agent", GetUserAgent()},
                            },
                            globalHeaders,
                            extendsHeaders,
                            headers
                        );
                    }
                    if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.Body))
                    {
                        Dictionary<string, object> m = AlibabaCloud.TeaUtil.Common.AssertAsMap(request.Body);
                        Dictionary<string, object> tmp = AlibabaCloud.TeaUtil.Common.AnyifyMapValue(AlibabaCloud.OpenApiUtil.Client.Query(m));
                        request_.Body = TeaCore.BytesReadable(AlibabaCloud.TeaUtil.Common.ToFormString(tmp));
                        request_.Headers["content-type"] = "application/x-www-form-urlencoded";
                    }
                    if (!AlibabaCloud.TeaUtil.Common.EqualString(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 credentialType = credentialModel.Type;
                        if (AlibabaCloud.TeaUtil.Common.EqualString(credentialType, "bearer"))
                        {
                            string bearerToken = credentialModel.BearerToken;
                            request_.Query["BearerToken"] = bearerToken;
                            request_.Query["SignatureType"] = "BEARERTOKEN";
                        }
                        else
                        {
                            string accessKeyId = credentialModel.AccessKeyId;
                            string accessKeySecret = credentialModel.AccessKeySecret;
                            string securityToken = credentialModel.SecurityToken;
                            if (!AlibabaCloud.TeaUtil.Common.Empty(securityToken))
                            {
                                request_.Query["SecurityToken"] = securityToken;
                            }
                            request_.Query["SignatureMethod"] = "HMAC-SHA1";
                            request_.Query["SignatureVersion"] = "1.0";
                            request_.Query["AccessKeyId"] = accessKeyId;
                            Dictionary<string, object> t = null;
                            if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.Body))
                            {
                                t = AlibabaCloud.TeaUtil.Common.AssertAsMap(request.Body);
                            }
                            Dictionary<string, string> signedParam = TeaConverter.merge<string>
                            (
                                request_.Query,
                                AlibabaCloud.OpenApiUtil.Client.Query(t)
                            );
                            request_.Query["Signature"] = AlibabaCloud.OpenApiUtil.Client.GetRPCSignature(signedParam, request_.Method, accessKeySecret);
                        }
                    }
                    _lastRequest = request_;
                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);

                    if (AlibabaCloud.TeaUtil.Common.Is4xx(response_.StatusCode) || AlibabaCloud.TeaUtil.Common.Is5xx(response_.StatusCode))
                    {
                        object _res = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response_.Body);
                        Dictionary<string, object> err = AlibabaCloud.TeaUtil.Common.AssertAsMap(_res);
                        object requestId = DefaultAny(err.Get("RequestId"), err.Get("requestId"));
                        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: " + requestId},
                            {"data", err},
                            {"description", "" + DefaultAny(err.Get("Description"), err.Get("description"))},
                            {"accessDeniedDetail", DefaultAny(err.Get("AccessDeniedDetail"), err.Get("accessDeniedDetail"))},
                        });
                    }
                    if (AlibabaCloud.TeaUtil.Common.EqualString(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(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(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(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(bodyType, "array"))
                    {
                        object arr = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response_.Body);
                        return new Dictionary<string, object>
                        {
                            {"body", arr},
                            {"headers", response_.Headers},
                            {"statusCode", response_.StatusCode},
                        };
                    }
                    else
                    {
                        return new Dictionary<string, object>
                        {
                            {"headers", response_.Headers},
                            {"statusCode", response_.StatusCode},
                        };
                    }
                }
                catch (Exception e)
                {
                    if (TeaCore.IsRetryable(e))
                    {
                        _lastException = e;
                        continue;
                    }
                    throw e;
                }
            }

            throw new TeaUnretryableException(_lastRequest, _lastException);
        }