我有一个API调用,它使用SelectCommand
同步操作。
protected void filterbutton_Click(object sender, EventArgs e)
{
string stroStatus = "";
string stroDelivery_Status = "";
SqlDataSource1.SelectParameters["oStatus"].DefaultValue = stroStatus;
Parameter pm = SqlDataSource1.SelectParameters["oDelivery_Status"];
if (!SqlDataSource1.SelectParameters.Contains(pm))
{
SqlDataSource1.SelectParameters.Add("oDelivery_Status",
stroDelivery_Status);
}
SqlDataSource1.SelectCommand = "SELECT * FROM [Orders] WHERE ([oStatus] = @oStatus) AND ([oDelivery_Status] = @oDelivery_Status)"
}
要查看API是否已成功完成,请在继续之前使用以下.Result
语句。
HttpResponseMessage response = client.PostAsync("api/updatelastname", new StringContent(string.Format("UserId={0}&LastName={1}", userId, lastName), Encoding.UTF8, "application/x-www-form-urlencoded")).Result;
我感到困惑的是,有时api调用完成没有问题,然后有时它没有。似乎有时代码不会等待API调用完成,因此if..then
为if (!response.IsSuccessStatusCode)
{
// Something went wrong
}
。
理想情况下,我认为最好在API调用中创建方法response.IsSuccessStatusCode
并使用false
关键字,但Web应用目前仅针对.NET 4并{{1}在.NET v4.5之前不支持async
。
在检查await
之前,有关如何确保API调用完成的任何想法?没有转向.NET v4.5 +?
答案 0 :(得分:1)
此时,网络应用仅针对.NET 4,直到.NET v4.5才支持异步和等待。
需要支持PostAsync
的是客户端(呼叫await
的人),而不是网络应用。我假设你的意思是客户 是一个网络应用程序。
有时api调用完成没有问题,然后有时它没有。
有时它没有完成,你的意思是?如同,代码永远不会从Result
?
在某些情况下Result
将会死锁,但我很惊讶在ASP.NET上找到一个(据我所知,Result
所有HttpClient
死锁仅在一些移动平台。)
似乎有时代码不会等待API调用完成,因此response.IsSuccessStatusCode为false。
你怀疑的是不可能的。 Result
将阻止,直到HTTP请求完成。如果IsSuccessStatusCode
返回false
,那就是因为API返回了一个不成功的状态代码。