Как вызвать параллельную обработку API вместо передачи одного за другим URI - PullRequest
0 голосов
/ 11 декабря 2019

Ниже приведен мой рабочий код, вызывающий один за другим URL-адрес.

Примеры URL-адресов: (https://XXXX.YYYY.com/API/ZZ/students/" + sAPIURL + "/ apps") передача кода студента в API и получение результата API. У API есть один аргумент - код студента.

foreach (var sAPIURL in APILIST)
{
    System.Net.HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sAPIURL);
    // Set the Method property of the request to GET.
    request.Method = "GET";
    string sUserNamePassword = sUserName + ":" + sPassword;
    byte[] byteUserNamePassword = System.Text.ASCIIEncoding.ASCII.GetBytes(sUserNamePassword);
    string encodedUserNamePassword = System.Convert.ToBase64String(byteUserNamePassword);

    request.Accept = "application/json";
    request.Headers.Add("Authorization", "Basic " + encodedUserNamePassword);
    request.Headers.Add("aw-tenant-code", sAPIKEY);

    //HttpWebResponse myHttpWebResponse = (HttpWebResponse)request.GetResponse();          
    System.Net.WebResponse response = request.GetResponse();
    if (((System.Net.HttpWebResponse)response).StatusCode != HttpStatusCode.OK)
    {
        MessageBox.Show(((System.Net.HttpWebResponse)response).StatusDescription + "\r\n" + "Link: " + sURL);
    }

    //if (!((System.Net.HttpWebResponse)response.statuscode = 200))
    //{
    //    //MsgBox(CType(response, System.Net.HttpWebResponse).StatusDescription);
    //    response.Close();
    //    return "Error";
    //}

    var dataStream = response.GetResponseStream();
    var reader = new System.IO.StreamReader(dataStream);
    sJSONData = reader.ReadToEnd();

    // Close the Stream object.
    dataStream.Close();
    reader.Close();
    response.Close();

    return sJSONData;  
}

Ответы [ 2 ]

1 голос
/ 11 декабря 2019

Вы можете сделать что-то подобное с HttpClient:

        using var client = new HttpClient(); // init client

        // set headers

        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
            "Basic", Convert.ToBase64String(
                System.Text.Encoding.ASCII.GetBytes(
                    $"{username}:{password}"))); 

        client.DefaultRequestHeaders.Add("aw-tenant-code", $"{key}");

        // generate list of requests
        var list = new List<Task<HttpResponseMessage>>();

        for (int i = 0; i < 10; i++) // count of parallel requests or other GET requests
        {
            // add requests to the list of tasks
            list.Add(client.GetAsync("https://www.google.com/"));
        }

        // all requests finished
        await Task.WhenAll(list);

        foreach (var task in list)
        {
            // get result per each request
            var result = await task;
        }

Или, если вы хотите использовать HttpRequestMessage

        var list = new List<Task<HttpResponseMessage>>();

        var httpRequestMessage = new HttpRequestMessage
        {
            Method = HttpMethod.Get,
            RequestUri = new Uri("some uri"),
            Headers = {
                // headers
            }
        };

        for (int i = 0; i < 10; i++)
        {
            list.Add(client.SendAsync(httpRequestMessage));
        }

        await Task.WhenAll(list);

        foreach (var task in list)
        {
            var result = await task;

            if (result.StatusCode == HttpStatusCode.OK)
            {
                // do something
            }

            // to read the content as string
            var stringResult = await result.Content.ReadAsStringAsync();

            // to deserialize the content as some entity
            var someEntity = await result.Content.ReadAsAsync<MyCustomObject>();
        }

Примечание: ваш метод должен быть асинхронным

1 голос
/ 11 декабря 2019

Попробуйте запустить параллельное задание, что-то вроде этого

  var Maintasks = new[]
                   {
                   Task.Factory.StartNew(() => apiCall()),
                   Task.Factory.StartNew(() => apiCall()),
                   Task.Factory.StartNew(() => apiCall())
                   };
  Task.WaitAll(Maintasks);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...