你能同步调用异步web api控制器方法吗



假设我有一个具有以下API控制器方法的Web服务:

public async Task<ActionResult<string>> Get()
{
await Task.Delay(1000);
return Ok("Success");
}

我似乎可以像这样的一样同步调用这个api控制器方法

var url = "http://example.com/api/example";
var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.Method = "GET";
string webStringResult;
using (HttpWebResponse httpResponse = (HttpWebResponse)httpWebRequest.GetResponse())
{
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
webStringResult= JsonConvert.DeserializeObject<string>(result);
}
}

我很震惊,这是有效的。我以为我将不得不被迫使用httpWebRequest.GetResponseAsync()

但似乎httpWebRequest.GetResponse()也起作用。

我的问题是,如果这是正确的工作流程,那么将GetResponse()与异步web方法一起使用与GetResponseAsync()相比会有什么影响。通常,如果你直接从另一个库/类调用异步方法,你必须从异步方法调用它,并且你必须等待它。然而,发出web请求有点不同,因为从技术上讲,你不是直接调用该方法。因此,我很惊讶地看到这一点奏效了,这将有助于了解这里发生的事情的含义/理解。

通常,如果您直接从另一个库/类调用异步方法,则必须从异步方法调用它,并且必须等待它。

是,在同一进程内

然而,发出web请求有点不同,因为从技术上讲,您不是直接调用该方法。

右。客户端根本没有调用服务器方法。它向服务器发出HTTP请求。服务器应用程序通过调用服务器方法来处理该HTTP请求。

由于这些是不同的进程,服务器不关心客户端是同步的还是异步的;客户端不关心服务器是同步的还是异步的。他们只是在网络上聊天。

如果这是正确的工作流,以及将GetResponse((与异步web方法一起使用与GetResponseAsync((相比的含义。

GetResponse只是意味着您的客户端是同步的。我想说,从技术上讲,它作为异步方法更合适,因为它是基于I/O的,但如果你对同步客户端很满意,那就完全可以了。

一种思考方法是假设客户端和服务器是用不同的语言编写的,而服务器代码是20年前编写的。它们可以一起工作是因为它们使用相同的协议(在本例中为http(,而不是因为它们是用相同版本的语言编写的。

话虽如此,请注意,这种通过使用http协议实现的分离是正确的,即使您在同一台机器上运行,甚至作为同一进程的一部分运行。例如,在测试中,您可以启动一个web服务器,并从同一程序对其进行http调用,无论是否异步

另一种思考方式是想象客户端和服务器使用"文件协议":如果客户端想要完成工作,它会将一个带有json的文件放在一个特殊的文件夹中;服务器监控这个文件夹读取文件,然后将响应保存为"response.json"。客户端可以用await File.WriteAllTextAsync写入文件,服务器可以用File.ReadAllText读取文件(非异步(。

最新更新