jquery1.9.1からasync/awaitを使用している.net4.5Webサービス(asmx)を呼び出す方法を理解しようとしています。jsコードは古典的です:
$.ajax({
type: "POST",
url: "ws/UpdCategory",
data: strData,
async: true,
contentType: "application/json; charset=utf-8",
dataType: "json",
complete: saveCategory_onComplete
});
ws.csのWebサービス、ws.asmxの背後にあるコード:
[WebMethod]
public async Task<int> UpdCategory(string jsonData)
{
JsonGenericResponse objWmJson = new JsonGenericResponse();
objWmJson.IsInError = "true";
try
{
JavaScriptSerializer objJss = new JavaScriptSerializer();
Dictionary<string, string> objDict = objJss.Deserialize<Dictionary<string, string>>(jsonData);
DataIfCloudEspresso objData = new DataIfCloudEspresso();
//
StringBuilder objBuilder = new StringBuilder();
objBuilder.Append("<?xml version=" + (char)39 + "1.0" + (char)39 + " encoding=" + (char)39 + ConfigurationService.XMLEncoding + (char)39 + "?>");
objBuilder.Append("<Category>");
.....various fields
objBuilder.Append("</Category>");
// the row below call the method on Data Access Layer
int updatedCount = await objData.UpdCategory(objBuilder.ToString());
return updatedCount;
}
}
そして最後にDALメソッド:
public async Task<int> UpdCategorieArticoli(string xmlData)
{
try
{
using (SqlConnection objConn = new SqlConnection(base.ConnectionString))
{
using (SqlCommand cmdADO = new SqlCommand("spUpd_Category", objConn))
{
cmdADO.Parameters.Add(new System.Data.SqlClient.SqlParameter("@XMLDoc", SqlDbType.Text));
cmdADO.Parameters["@XMLDoc"].Value = xmlData;
cmdADO.Parameters.Add(new System.Data.SqlClient.SqlParameter("@RETURN_VALUE", SqlDbType.Int));
cmdADO.Parameters["@RETURN_VALUE"].Direction = ParameterDirection.ReturnValue;
//
cmdADO.CommandType = CommandType.StoredProcedure;
//
await objConn.OpenAsync().ConfigureAwait(false);
return await cmdADO.ExecuteNonQueryAsync().ConfigureAwait(false);
}
}
}
catch (Exception)
{
throw;
}
finally
{
}
}
問題は次のとおりです。たとえば、Page_Loadから呼び出された場合のDALメソッドは、問題なく機能します。代わりに、Webサービス(javascriptから呼び出される)から呼び出されると、コードはcmdADO.ExecuteNonQueryAsync()を待つ行でハングします。
問題はクライアントからのコンテキストスイッチ(ブラウザからのjsコード)とその背後にあるコードがサーバー上で機能していることだと思いますが、この問題を解決する方法がわかりません。グーグルで見つかったさまざまなコードを試しましたが、解決策はありません。
明らかな範囲は、最大のパフォーマンスを得るために非同期コードを最大限に活用することです。
コールバックを使用して古いスタイルのBeginExecuteNonQueryを作成しようとしましたが、EndExecuteNonQueryから呼び出し元のWebサービスに結果を伝達する方法に関する解決策が見つかりませんでした。