C# 使用C的异步HttpWebRequest调用#

C# 使用C的异步HttpWebRequest调用#,c#,async-await,C#,Async Await,我有以下代码: //ids are a list of strings foreach (string id in ids) { string serviceurl = "https://xxx.xx.xxx/internal/v2/idsearch?id=" + id; List<string> lst = new List<string>(); var task = WebUtil.MakeAsyncRequest("GET", servi

我有以下代码:

 //ids are a list of strings
foreach (string id in ids)
{
    string serviceurl = "https://xxx.xx.xxx/internal/v2/idsearch?id=" + id;
    List<string> lst = new List<string>();
    var task =  WebUtil.MakeAsyncRequest("GET", serviceurl, "application/json");
    string val =  task.Result;
    if (val != "")
      lst.Add(val);
}

public static Task<string> MakeAsyncRequest(string method,string url, string contentType)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.ContentType = contentType;
    request.Method = method;
    request.Timeout = 20000;
    request.Proxy = null;

    string clientId = ConfigManager.GetClientId;
    string clientSecret = ConfigManager.GetClientSecret;
    request.Headers.Add(HttpRequestHeader.Authorization, ConfigManager.GetServiceKey);
    request.Headers.Add("client_id", clientId);
    request.Headers.Add("client_secret", clientSecret);

    Task<WebResponse> task = Task.Factory.FromAsync(
        request.BeginGetResponse,
        asyncResult => request.EndGetResponse(asyncResult),
        (object)null);

    return task.ContinueWith(t => ReadStreamFromResponse(t.Result));
}

private static string ReadStreamFromResponse(WebResponse response)
{
    using (Stream responseStream = response.GetResponseStream())
    using (StreamReader sr = new StreamReader(responseStream))
    {
        //Need to return this response 
        string strContent = sr.ReadToEnd();
        return strContent;
    }
}

ReadToEnd
是同步的,是。有异步等价物

还要注意,DNS解析在这里是同步的。这是一个一直没有被修复的bug


也许,最好的解决方法是使用
HttpClient
,这使得异步下载字符串成为一行程序。

我认为发出
异步
请求的最好方法是
HttpClient
。 你可以这样写:

var client = new HttpClient();
var request = new HttpRequestMessage() 
{
    RequestUri = new Uri("xxxxxx"),
    Method = HttpMethod.Get,
};

request.Headers.Accept.Add(new ....);
var response = await client.SendAsync(request);
//read a result from the repsonse

你没想过HttpClient吗?它包含框中的异步方法
var client = new HttpClient();
var request = new HttpRequestMessage() 
{
    RequestUri = new Uri("xxxxxx"),
    Method = HttpMethod.Get,
};

request.Headers.Accept.Add(new ....);
var response = await client.SendAsync(request);
//read a result from the repsonse