C# 从jquery调用异步.NET4.5Web服务
我试图理解如何从jQuery1.9.1调用使用async/await的.NET4.5Web服务(asmx)。 js代码非常经典: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
$.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可以工作。谢谢