摘要:matt powell 介紹了如何在服務器端使用異步 web 方法,來創建高性能的 microsoft asp.net web 服務。
簡介
在九月份的第三篇專欄(英文)中,我談到了利用 microsoft® .net framework 的客戶端功能通過 http 異步調用 web 服務的問題。這種調用 web 服務的方法非常有用,使用時不必鎖定您的應用程序或產生過多后臺線程。現在我們了解一下在服務器端提供類似功能的異步 web 方法。異步 web 方法在編寫 isapi 擴展方面具有與 hse_status_pending 方法類似的高性能,但不需要為管理自己的線程池編寫代碼,同時又具有以托管代碼方式運行的所有優點。
首先我們考慮一下常規的同步 microsoft® asp.net web 方法。當您從同步 web 方法返回時,將發送對該方法的響應。如果需要較長的時間來完成請求,則處理請求的線程會一直被占用,直到方法調用結束。不幸的是,多數較長的調用是由較長的數據庫查詢或對另一個 web 服務的調用等事件引起的。例如,如果您調用數據庫,當前線程會一直等待調用完成。線程無事可做,只是等待,直至聽到查詢的返回。當線程等待完成對 tcp 套接字或后端 web 服務的調用時,也會出現類似的問題。
讓線程處于等待狀態很不好,特別是在服務器的運行壓力很大的情況下。等待中的線程不會進行任何有效工作,例如為其他請求提供服務。我們需要找到一種方法,能夠在服務器上開始較長的后臺進程,同時又能將當前線程返回到 asp.net 進程池。然后,當較長的后臺進程完成時,我們調用一個回調函數,結束對請求的處理,并通過某種方式通知 asp.net 請求已完成。實際上,這種功能可由 asp.net 使用異步 web 方法提供。
異步 web 方法的工作原理
當您使用 web 方法編寫典型的 asp.net web 服務時,microsoft® visual studio® .net 只是編譯您的代碼以創建程序集;當收到對其 web 方法的請求時,將調用該程序集。程序集本身并不知道關于 soap 的任何事情。因此,當您的應用程序首次啟動時,asmx 處理程序必須反映您的程序集,以確定提供哪些 web 方法。對于常規的同步請求,這些操作都很簡單:找出哪些方法具有關聯的 webmethod 屬性、基于 soapaction http 標頭來設置調用正確方法的邏輯。
對于異步請求,在反映過程中,asmx 處理程序尋找具有某種簽名并將簽名識別為異步的 web 方法。該處理程序將尋找符合以下規則的方法對: