[英]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.