C# 如何使HttpWebRequest函数异步?

C# 如何使HttpWebRequest函数异步?,c#,.net-core-3.0,C#,.net Core 3.0,我正在尝试使我的函数异步。我该怎么办?这是一个HttpWebRequest private void PostToGoogleChat(string json) { HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(_chatUrl); httpWebRequest.ContentType = "application/json"; httpWebRequest.Method = "POST

我正在尝试使我的函数异步。我该怎么办?这是一个HttpWebRequest

private void PostToGoogleChat(string json)
{
    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(_chatUrl);
    httpWebRequest.ContentType = "application/json";
    httpWebRequest.Method = "POST";


    using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
    {
        streamWriter.Write(json);
    }

    var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
    using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
    {
        var result = streamReader.ReadToEnd();
    }
}
您是新手,所以我不会详细介绍HttpClient,但是应该重用该实例。试着做一些关于如何实现这一点的自我研究。

如果您真的想使用HttpWebRequest,最接近异步的工作流如下所示:

HttpWebRequest webRequest;

void BeginWebRequest()
{
    webRequest.BeginGetResponse(new AsyncCallback(EndWebRequest),null);
}

void EndWebRequest(IAsyncResult result)
{
    webRequest.EndGetResponse(result);
}

上面的代码使用旧的“回调”方式进行异步通信。您的请求结果将通过EndWebRequest方法接收


这样说,你应该考虑切换到HttpClient,因为它支持更容易的“AsiNC ->等待”语法。

“如何制作HTTPWebRebug函数AsiNC”:通过使用HTTPcli客户代替。使用HTTPcli客户代替。没有理由在核心3的新代码中仍然使用WebRequest等但不要使用它。改用HttpClient。请求既不是同步的,也不是异步的,它只是一个请求对象。获取响应需要是同步的,或者asyncHttpClient应该是静态的。根据文件。“它打算实例化一次并在应用程序的整个生命周期内重复使用。为每个请求实例化HttpClient类将耗尽重载下可用的套接字数量。这将导致SocketException错误。”@WilliamXifaras-重复使用:是。静态:不是唯一的选项,通常也不是最好的。它不需要是“静态的”,但实例需要通过singleton或HttpClientFactory(池)重用。因为他是新来的,所以我只是向他展示如何简单地发出异步请求。我觉得没有必要编辑它,因为客户端生命周期与发出异步请求无关@WilliamXifaras@Going-是的,我喜欢HttpClientFactory而不是HttpClient。@Henkholtman是真的,这是有争议的,但我不会在这里这么做。考虑到它的.NET内核,我会选择使用HttpClientFactory。有了它,你可以把它变成一个值得期待的方法。但仍然不如使用HttpClient好。
HttpWebRequest webRequest;

void BeginWebRequest()
{
    webRequest.BeginGetResponse(new AsyncCallback(EndWebRequest),null);
}

void EndWebRequest(IAsyncResult result)
{
    webRequest.EndGetResponse(result);
}