我目前正在开发一个与Web API集成的应用程序。我有一个异步函数,它向Web API发送PUT
请求以更新产品。
public async Task<ResponseStatus> updateProduct(Item product)
{
string URL = client.BaseAddress + "/catalog/products/" + product.id;
HttpResponseMessage response = await client.PutAsJsonAsync(URL, product).ConfigureAwait(false);
var payload = response.Content.ReadAsStringAsync();
ResponseStatus res = JsonConvert.DeserializeObject<ResponseStatus>(await payload.ConfigureAwait(false));
return res;
}
在我用来测试我的应用程序的控制台应用程序中,此功能完全按预期工作,我在响应的Result
中收到更新的产品作为JSON字符串。
但是当我尝试从ASP.Net应用程序调用此函数时,我在Result
中收到一个空字符串,即使它的状态代码为200.我也可以看到我的更新没有对产品起作用,即使它在控制台应用程序中调用时肯定会更新。
我有一些Web API调用,例如此GET
请求,它的工作方式几乎完全相同,但这在ASP.Net应用程序和测试控制台应用程序中有效。
public async Task<Product> getProductByID(int id)
{
Product product = null;
string URL = client.BaseAddress + "/catalog/products/" + id;
string additionalQuery = "include=images,variants";
HttpResponseMessage response = await client.GetAsync(URL + "?" + additionalQuery).ConfigureAwait(false);
if (response.IsSuccessStatusCode)
{
var payload = response.Content.ReadAsStringAsync();
product = JsonConvert.DeserializeObject<Product>(await payload.ConfigureAwait(false));
}
return product;
}
为什么在ASP.Net应用程序中,即使Result
为空并且实际上没有对产品进行更新,我也会收到成功状态代码?
答案 0 :(得分:1)
您需要await
payload Task
没有ConfigureAwait(false)
。
使用ConfigureAwait(false)
时,如果Task
返回Result
,则无法保证保留ASP.NET响应上下文。这是ASP.NET运行时的特性。
它被称为Best Practice tip for async/await by Microsoft:
在需要上下文的方法中的await之后有代码时,不应该使用ConfigureAwait。对于GUI应用程序,这包括操作GUI元素,写入数据绑定属性或依赖于特定于GUI的类型(如Dispatcher / CoreDispatcher)的任何代码。 对于ASP.NET应用程序,这包括使用HttpContext.Current或构建ASP.NET响应的任何代码,包括控制器操作中的return语句。
答案 1 :(得分:1)