C# 从jquery调用异步.NET4.5Web服务

C# 从jquery调用异步.NET4.5Web服务,c#,asp.net,jquery,async-await,C#,Asp.net,Jquery,Async Await,我试图理解如何从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: saveCat

我试图理解如何从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;
    }
}
[WebMethod]
公共异步任务UpdCategory(字符串jsonData)
{
JsonGenericResponse objWmJson=新的JsonGenericResponse();
objWmJson.isinnerre=“true”;
尝试
{
JavaScriptSerializer objJss=新的JavaScriptSerializer();
字典objDict=objJss.Deserialize(jsonData);
DataIfCloudEspresso objData=新DataIfCloudEspresso();
//
StringBuilder objBuilder=新StringBuilder();
objBuilder.Append(“”);
objBuilder.Append(“”);
……各个领域
objBuilder.Append(“”);
//下面的行调用数据访问层上的方法
int updatedCount=await objData.UpdCategory(objBuilder.ToString());
返回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
    {
    }
}
公共异步任务UpdCategorieArticoli(字符串xmlData)
{
尝试
{
使用(SqlConnection objConn=newsqlconnection(base.ConnectionString))
{
使用(SqlCommand cmdADO=newsqlcommand(“spUpd_类别”,objConn))
{
Add(new System.Data.SqlClient.SqlParameter(“@XMLDoc”,SqlDbType.Text));
cmdADO.Parameters[“@XMLDoc”].Value=xmlData;
Add(new System.Data.SqlClient.SqlParameter(“@RETURN_VALUE”,SqlDbType.Int));
cmdADO.Parameters[“@RETURN_VALUE”].Direction=ParameterDirection.ReturnValue;
//
cmdADO.CommandType=CommandType.StoredProcess;
//
await objConn.OpenAsync().ConfigureAwait(false);
返回wait cmdADO.ExecuteNonQueryAsync().ConfigureWait(false);
}
}
}
捕获(例外)
{
投掷;
}
最后
{
}
}
问题是这样的:例如,从页面加载调用DAL方法if时,不会出现问题;相反,当从web服务调用(从javascript调用)时,代码挂起在wait cmdADO.ExecuteNonQueryAsync()行上

我假设问题是来自客户端的上下文切换(来自浏览器的js代码)和在服务器上工作的代码,我不知道如何解决这个问题。 我尝试过谷歌搜索的各种代码,但没有解决方案

显而易见的范围是最大限度地使用异步代码以获得最高性能


我曾尝试编写一个带有回调的老式BeginExecutenQuery,但我还没有找到一个解决方案,说明如何将结果从EndExecutenQuery传递给调用web服务。

jQuery async本身就是一个async。这就是正在发生的事情。当您调用web服务时,它执行数据访问逻辑async,并向web服务返回http响应OK,这意味着该方法已成功执行,但不返回任何结果

当您从Page_Load调用它时,这意味着页面的呈现将允许所有异步方法完成以执行呈现


所以底线是不要在web服务上使用async,因为jQuery端有async。

根据上的评论,ASMX根本不支持
async
。这就是你的代码不起作用的原因。它与jQuery的异步性也没有任何关系。

你能展示一下
wait objData.UpdCategory(objBuilder.ToString())
UpdCategorieArticoli(string xmlData)
之间的调用链吗?我谦虚地认为jQuery异步性超出了问题的范围,而且我认为没有任何东西返回到浏览器,因为行
返回updatedCount
将暂停执行,直到等待返回。我尝试编写与WCF相同的服务,现在asyc/await可以工作。谢谢