[英]Can you call an async web api controller method synchronously?
假设我有一个具有以下 API controller 方法的网络服务:
public async Task<ActionResult<string>> Get()
{
await Task.Delay(1000);
return Ok("Success");
}
好像我可以像这样同步调用这个 api controller 方法
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
(非异步)读取文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.