2013-03-10 77 views
2

我想了解如何从jquery 1.9.1调用使用异步/等待的.net 4.5 web服务(asmx)。 JS代码是经典:从jquery调用异步.NET 4.5 Web服务

$.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服务进行通信。

+0

你可以在'await objData.UpdCategory(objBuilder.ToString())'和'UpdCategorieArticoli(string xmlData)'之间显示调用链吗? – 2013-03-11 00:56:00

回答

1

jQuery的异步是由它自己一个异步。这就是发生的事情。当您调用Web服务时,它会执行异步数据访问逻辑并返回对Web服务“确定”的http响应,这意味着该方法已成功执行但未返回任何结果。

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

因此,底线是不要在Web服务上使用异步,因为你在jQuery端有异步。

+0

我谦虚地认为,jQuery异步超出了问题的范围,并且我认为没有任何东西返回给浏览器,因为'return updatedCount;'行暂停执行,直到等待返回。 – 2013-03-11 01:57:18