Saving a token to be reused after a loop

105 Views Asked by At

I am working on a project where I can only return 30 results at a time from a server. I am using a loop in my program to change a parameter of the connection and return the next set after each loop by using the GetWorkers() command below.

I need to use a token to get the JObject.Parse(serverResponse). I want to be able to save the Token upon each loop to reuse it since it times out after 1 hour.

I am not sure what the best way to save the token is upon every loop. Currently it takes 30 sec to 1 minute to execute this entire process, and I would like it to be shorter anywhere I can manage to avoid any timeouts.

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;
    }
0

There are 0 best solutions below