C#(.NET 4.5)で書かれたASMX Webサービスを使用する従来のVB6アプリケーションは、ライブラリ(C#/ .NET 4.5)を使用してビジネスロジックを実行します。ライブラリメソッドの1つは、長期実行のデータベースストアドプロシージャをトリガし、その最後に、ストアドプロシージャによって生成されたデータを消費する別のプロセスを開始する必要があります。要件の1つは、Webサービスを呼び出した後、コントロールがすぐにVB6クライアントに返されなければならないということです。ライブラリメソッドはasync
で、Action
コールバックをパラメータとし、webserviceはコールバックを匿名メソッドとして定義し、結果はawait
ライブラリメソッド呼び出しのコールバックを使用した.NET非同期Webサービス呼び出し
ハイレベルで、それは次のようになります。
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リクエストが実行を終了し、「ドアが外れている」ということです。コールバックを実行する場所はありません。あなたはその電話を待ってみましたか? –
リクエストの実装を確認してください。 asyncを使用している場合は、パイプライン全体で一貫性のあるソリューションを使用する必要があります。 –