簡體   English   中英

異步 Web 服務調用

[英]Async Web Service Calls

我正在尋找創建 web 服務和隨附的 web 應用程序,該應用程序使用異步 web 服務調用。 我已經看到很多關於如何進行異步調用的建議,但似乎沒有一個完全適合我正在嘗試做的事情或正在使用真正過時的技術。 我正在嘗試在 ASP.net 3.5 (VS2008) 中執行此操作

我需要做的是:

  1. 網頁需要向服務提交請求
  2. 然后頁面需要每 5 秒左右輪詢一次服務以查看任務是否已完成
  3. 完成后,需要從服務中檢索請求。

有人可以給我一些建議或指出正確的方向嗎?

我通常處理異步服務器端處理的方式是:

  1. 讓網頁向 Web 服務發起請求,並讓服務向長期運行的事務返回一個 ID。 就我而言,我在客戶端網頁上使用了 Ajax 和 jQuery 以及一個以 JSON 格式返回數據的 Web 服務。 ASP.NET MVC is particularly well suited for this, but you can use ASP.NET to return JSON string in response to a GET, or not use JSON at all.

  2. 讓服務器在數據庫中創建一條記錄,該記錄還存儲要處理的關聯數據。 此交易的 ID 返回到客戶端網頁。 然后該服務通過消息隊列將消息發送到第三個服務。 在我的例子中,該服務是一個 WCF 服務,托管在一個 Windows 服務中,MSMQ 作為中介。 需要注意的是,最好不要在 ASP.NET 中進行實際的任務處理,因為它不適用於長時間運行的請求。 在高需求系統中,您可能會耗盡可用線程。

  3. 第三個服務通過從數據庫讀取和處理必要的數據來接收和響應排隊的消息。 它最終將數據庫記錄標記為“完成”。

  4. 客戶端網頁輪詢傳遞事務記錄 ID 的 Web 服務。 Web 服務根據此 ID 查詢數據庫以確定記錄是否標記為完整。 如果完成,則查詢結果數據集並返回。 否則它返回一個空集。

  5. 客戶端網頁處理 web 服務響應,該響應將包含結果數據或空集,它應該繼續輪詢。

這只是一個例子,你可能會發現你可以走捷徑,避免在第三個服務中進行處理,只使用 ASP.NET 線程。 但這提出了它自己的問題,即如何讓另一個請求(輪詢請求)知道原始請求是否完成。 hackish 的解決方案是在 static 變量中使用線程安全集合,該變量將保存事務 ID/結果對。 但是對於這項工作,使用數據庫確實更好。

編輯:我現在看到它似乎是一個演示而不是生產系統。 對於“真實世界”的情況,我仍然堅持上述大綱,但對於演示,“hackish”解決方案就足夠了。

哪一部分需要做異步? 據我所知,您的操作是同步的:1) -> 2) -> 3)

一個簡單的 web 服務就可以了,IIS(與任何 web 服務器一樣)支持異步處理多個請求,所以你沒有問題。

您可能需要注意的事情 javascript 引擎也在單線程中執行代碼。

  • 步驟 0 :創建 web 服務。
  • 第 1 步:創建 web 應用程序項目(假設它是 ASP.NET)。
  • 第 2 步:將 web 對 Web 服務的引用添加到您的 web 應用程序項目中。
  • 第 3 步:該引用將為您創建一個代理,您可以使用它來調用同步和異步調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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