使用.NET核心的异步请求

Sas*_*sha 6 .net c# console-application dotnet-httpclient .net-core

我需要一些帮助来找出问题所在.我已经使用了ASP.NET核心,我对此非常熟悉,尽管.NET核心C#似乎在"崩溃"并且在尝试发出异步请求时退出.

我有一个返回系统外部IP的方法

private async Task<string> getExternalIP()
    {
        using (System.Net.Http.HttpClient HC = new System.Net.Http.HttpClient())
        {
            return await HC.GetStringAsync("https://api.ipify.org/");
        }

    }
Run Code Online (Sandbox Code Playgroud)

这应该可以工作,但是当它到达HC.GetStringAsync时会退出.我也试过在它上面设一个断点,但它实际上并没有运行.

我试图通过使用调用该方法

string Address = await getExternalIP();
Run Code Online (Sandbox Code Playgroud)

任何帮助都很感激,希望我不只是忽略了一些东西.

谢谢!

Mat*_*ero 10

您提出的解决方案并不好.

  1. 它是同步的
  2. 它可能导致死锁

作为替代方案,请尝试以下方法:

private async Task<string> GetExternalIP()
{
    using (HttpClient client = new HttpClient())
        return await client.GetStringAsync("https://api.ipify.org/");
}
Run Code Online (Sandbox Code Playgroud)

你的调用方法也应该是异步的:

public async Task CallingMethod()
{
     // ...
     string address = await GetExternalIP();
     // ...
}
Run Code Online (Sandbox Code Playgroud)

它以前不适合你的原因是由于使用async void而不是async Task(通过评论猜到这一点).

async void是一种无法等待的异步方法.这意味着,你只需要打电话就可以忘掉它.您不会捕获任何异常,您将不会获得任何返回值.

async Task是一个等待的异步方法,不返回任何东西.它是void同步方法的异步对应物.此外,由于它是等待的,您还可以捕获异步代码可能出现的任何异常.