2

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サービスに結果を伝達する方法に関する解決策が見つかりませんでした。

4

2 に答える 2

2

Is it possible to use async/await in webmethod asmx serviceに関するコメントによると、ASMX は単にサポートしていませんasync。それがあなたのコードが機能しない理由です。また、jQuery が非同期であることとは何の関係もありません。

于 2013-03-11T01:16:42.660 に答える
1

jQuery async はそれ自体が非同期です。これが起こっていることです。Web サービスを呼び出すと、データ アクセス ロジックが非同期で実行され、HTTP 応答が Web サービス OK に返されます。これは、メソッドが正常に実行されたが、結果が返されなかったことを意味します。

Page_Load から呼び出すと、ページのレンダリングは、すべての非同期メソッドが終了してレンダリングを実行することを意味します。

jQuery側に非同期があるため、Webサービスで非同期を使用しないでください。

于 2013-03-11T00:51:26.917 に答える