我想了解如何从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服务进行通信。
你可以在'await objData.UpdCategory(objBuilder.ToString())'和'UpdCategorieArticoli(string xmlData)'之间显示调用链吗? – 2013-03-11 00:56:00