如何调用API并行处理,而不是一一传递URI

问题描述 投票:0回答:2

下面是我的工作代码,一个一个地调用URL。

URL示例:(https://XXXX.YYYY.com/API/ZZ/students/“ + sAPIURL +” / applications“)将学生代码传递给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;  
}
c# uri
2个回答
1
投票
尝试运行并行任务,类似这样

var Maintasks = new[] { Task.Factory.StartNew(() => apiCall()), Task.Factory.StartNew(() => apiCall()), Task.Factory.StartNew(() => apiCall()) }; Task.WaitAll(Maintasks);


1
投票
您可以使用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>(); }

注意:您的方法应该是async

© www.soinside.com 2019 - 2024. All rights reserved.