0

我正在做一个项目,我一次只能从服务器返回 30 个结果。我在我的程序中使用一个循环来更改连接的参数,并使用下面的 GetWorkers() 命令在每个循环之后返回下一组。

我需要使用令牌来获取 JObject.Parse(serverResponse)。我希望能够在每个循环中保存令牌以重用它,因为它在 1 小时后超时。

我不确定在每个循环中保存令牌的最佳方法是什么。目前,执行整个过程需要 30 秒到 1 分钟,我希望它在我能设法避免任何超时的任何地方都更短。

private ADPAccessToken GetAccessToken()
    {
        //var session = HttpContext.Current.Session;
        ////var session = Request.Properties["System.Web.HttpContex"] as HttpContextWrapper;

        ADPAccessToken token = null;
        //if (session["Token"] != null)
        //{
        //    token = session["Token"] as ADPAccessToken;
        //    if (DateTime.Compare(DateTime.Now, token.ExpiresOn.Value) > 0)
        //        token = null;
        //}
        if (token == null)
        {
            //string formData = string.Concat("grant_type=client_credentials&scope=", HttpUtility.UrlEncode(accessScope));
            string formData = string.Concat("grant_type=client_credentials");
            var usrpwd = Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Concat(NetworkUserName, ":", NetworkUserPassword)));
            byte[] data = Encoding.ASCII.GetBytes(formData);

            var result = postToADPServer(ADPAuthenticationURL, data, "Basic " + usrpwd);

            if (!string.IsNullOrEmpty(result))
            {
                token = JsonConvert.DeserializeObject<ADPAccessToken>(result);
                //session["Token"] = token;
            }
        }

        return token;
    }


    public JObject GetWorkers()
    {
        return GetData(getWorkerURL);
    }

    private JObject GetData(string url)
    {
        ADPAccessToken token = GetAccessToken();
        HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
        var usrpwd = Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(token.TokenType + " " + token.AccessToken));
        var serverResponse = postToADPServer(url, null, token.TokenType + " " + token.AccessToken, "application/json");
        return JObject.Parse(serverResponse);
    }



    private string postToADPServer(string url, byte[] postData, string authorization, string contentType = null)
    {
        HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
        X509Certificate2 certificate = new X509Certificate2(");
        myHttpWebRequest.ClientCertificates.Add(certificate);

        myHttpWebRequest.Headers.Add(HttpRequestHeader.Authorization, authorization);

        if (postData != null)
        {
            if (!string.IsNullOrEmpty(contentType))
                myHttpWebRequest.ContentType = contentType;
            else
                myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";


            myHttpWebRequest.Method = "POST";
            myHttpWebRequest.ContentLength = postData.Length;
            Stream requestStream = myHttpWebRequest.GetRequestStream();
            requestStream.Write(postData, 0, postData.Length);
            requestStream.Close();
        }

        HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();

        Stream responseStream = myHttpWebResponse.GetResponseStream();

        StreamReader myStreamReader = new StreamReader(responseStream, Encoding.Default);

        string pageContent = myStreamReader.ReadToEnd();

        myStreamReader.Close();

        responseStream.Close();

        myHttpWebResponse.Close();

        return pageContent;
    }
4

0 回答 0