1

I'm returning the status code from 3 different URL's using a ForEach Loop to iterate through the results. It returns the results just fine, but is returning 3 sets of results.

public static List<Models.SiteStatus> GetStatus()
{
    statusList.Clear();

    // website urls to check
    string site1 = "https://www.google.com";
    string site2 = "https://www.google.com";
    string site3 = "https://www.google.com";

    int site1Status = 0;
    int site2Status = 0;
    int site3Status = 0;

    HttpStatusCode result = default;
    HttpWebResponse response = null;

    // add urls to a list to pass through
    List<Uri> urls = new List<Uri>();
    urls.Add(new Uri(site1));
    urls.Add(new Uri(site2));
    urls.Add(new Uri(site3));


    // check status per site
    foreach (Uri u in urls)
    {
        try
        {
            HttpWebRequest request = WebRequest.Create(u) as HttpWebRequest;
            // just request headers
            request.Method = "HEAD";
            response = request.GetResponse() as HttpWebResponse;
            result = response.StatusCode;
            // 15 second timeout
            request.Timeout = 15000;
        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            if (response != null)
            {
                if (response.ResponseUri.AbsoluteUri == site1 && response.StatusCode == result)
                {
                    site1Status = (int)response.StatusCode;
                }
                if (response.ResponseUri.AbsoluteUri == site2 && response.StatusCode == result)
                {
                    site2Status = (int)response.StatusCode;
                }
                if (response.ResponseUri.AbsoluteUri == site3 && response.StatusCode == result)
                {
                    site3Status = (int)response.StatusCode;
                }

                var res = new SiteStatus
                {
                    url1Site = site1,
                    url1Status = site1Status,
                    url2Site = site2,
                    url2Status = site2Status,
                    url3Site = site3,
                    url3Status = site3Status
                };

                statusList.Add(res);
            }
            else
            {

            }
        }
        // close connection
        response.Close();
    }
    return statusList;
}

The returned results appear something like this;

  • Site 1 = 200
  • Site 2 = 0
  • Site 3 = 0

  • Site 1 = 200
  • Site 2 = 200
  • Site 3 = 0

  • Site 1 = 200
  • Site 2 = 200
  • Site 3 = 200

I just need the last set of results returned in the frontend html, but can't seem to figure it out. Any assistance it greatly appreciated.

1
  • You are creating a new set of results every time around the foreach loop. Move the new SiteStatus lines outside of the loop Commented Jan 30, 2020 at 9:55

1 Answer 1

6

Move this line that creates res and add to the list out of the loop.

/// MOVE THIS HERE, JUST ABOVE 'RETURN'
var res = new SiteStatus
{
    url1Site = site1,
    url1Status = site1Status,
    url2Site = site2,
    url2Status = site2Status,
    url3Site = site3,
    url3Status = site3Status
};

statusList.Add(res);
///

return statusList;
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.