【发布时间】:2020-06-20 01:25:21
【问题描述】:
我对 ASP.Net 和异步编码有点陌生,所以请耐心等待。我已经用 C# 为我想在 ASP.Net 应用程序中使用的 Web API 编写了一个异步包装器。
这是 C# API 包装器中的函数之一:
public async Task<string> getProducts()
{
Products products = new Products();
products.data = new List<Item>();
string URL = client.BaseAddress + "/catalog/products";
string additionalQuery = "include=images";
HttpResponseMessage response = await client.GetAsync(URL + "?" + additionalQuery);
if (response.IsSuccessStatusCode)
{
Products p = await response.Content.ReadAsAsync<Products>();
products.data.AddRange(p.data);
while (response.IsSuccessStatusCode && p.meta.pagination.links.next != null)
{
response = await client.GetAsync(URL + p.meta.pagination.links.next + "&" + additionalQuery);
if (response.IsSuccessStatusCode)
{
p = await response.Content.ReadAsAsync<Products>();
products.data.AddRange(p.data);
}
}
}
return JsonConvert.SerializeObject(products, Formatting.Indented);
}
然后,我的 ASP.Net 应用程序(将使用 Javascript 文件中的 Ajax 调用)中有一个 WebMethod,它应该调用 getProducts() 函数。
[WebMethod]
public static string GetProducts()
{
BigCommerceAPI api = getAPI();
return await api.getProducts();
}
现在这当然行不通,因为 WebMethod 不是异步方法。我试图将其更改为如下所示的异步方法:
[WebMethod]
public static async Task<string> GetProducts()
{
BigCommerceAPI api = getAPI();
return await api.getProducts();
}
此代码确实可以运行,但一旦到达 getProducts() 函数中的 HttpResponseMessage response = await client.GetAsync(URL + "?" + additionalQuery); 行,调试器就会停止,不会返回任何错误或数据。
我错过了什么?如何从我的 ASP 应用程序中调用此异步 API?
【问题讨论】:
-
据我所知,您不需要再次传递基地址,如果您只需执行
await client.GetAsync("/catalog/products?" + additionalQuery)应该可以工作(因为您已经设置了基地址) -
所以它仍然挂在那条线上等待激活?
-
@maccettura 在大多数情况下你是正确的,但是在这种情况下,基地址是
http://website.com/store/v3/所以如果我只是调用client.GetAsync("/catalog/products?" + additionalQuery' 它会将请求更改为http://website.com/catalog/products缺少 @ 987654329@ 部分,因此任何请求都会返回 404。 -
@Fran 它本身并没有挂起,调试只是停止而没有错误,并且 getProducts() 函数的其余部分没有被调用。 WebMethod 也不返回任何数据。
-
尝试将 .ConfigureAwait(false) 添加到您正在等待的所有 GetAsync 语句中。如果可行,我会用链接和解释写一个更长的答案。
标签: c# asp.net asynchronous