簡體   English   中英

你能同步調用異步 web api controller 方法嗎?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM