我們有一個傳統的VB6應用程序,它使用用C#(.NET 4.5)編寫的ASMX webservice,後者又使用庫(C#/ .NET 4.5)執行某些業務邏輯。其中一個庫方法會觸發長時間運行的數據庫存儲過程,最後我們需要啓動另一個使用存儲過程生成的數據的進程。因爲其中一個要求是控件必須在調用webservice後立即返回到VB6客戶端,庫方法是async
,將Action
回調作爲參數,webservice將回調定義爲匿名方法,而不是await
結果庫方法調用。帶回調的.NET異步webservice調用
在高層次上,它看起來像這樣:
using System; using System.Data.SqlClient; using System.Threading.Tasks; using System.Web.Services; namespace Sample { [WebService(Namespace = "urn:Services")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class MyWebService { [WebMethod] public string Request(string request) { // Step 1: Call the library method to generate data var lib = new MyLibrary(); lib.GenerateDataAsync(() => { // Step 2: Kick off a process that consumes the data created in Step 1 }); return "some kind of response"; } } public class MyLibrary { public async Task GenerateDataAsync(Action onDoneCallback) { try { using (var cmd = new SqlCommand("MyStoredProc", new SqlConnection("my DB connection string"))) { cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.CommandTimeout = 0; cmd.Connection.Open(); // Asynchronously call the stored procedure. await cmd.ExecuteNonQueryAsync().ConfigureAwait(false); // Invoke the callback if it's provided. if (onDoneCallback != null) onDoneCallback.Invoke(); } } catch (Exception ex) { // Handle errors... } } } }
在本地測試上述工作,但是當代碼被部署爲web服務步驟2從不執行,即使步驟1存儲過程完成並生成數據。
任何想法我們做錯了什麼?
您的本地機器的防火牆可能會阻止傳入的連接... – Eser
另外,我想第1步調用'lib.GenerateDataAsync'(說'GenerateData',它沒有顯示)。我認爲問題在於asmx請求已經完成執行並且「正在出門」,並且「無處執行」了回調。你有沒有試過等待那個電話? –
查看您的請求實施。如果您使用異步,則必須在整個管道中使用它以獲得最一致的解決方案。 –