【发布时间】:2018-12-31 15:51:57
【问题描述】:
我在 AWS 中创建了一个 Web API,我试图从使用 ASP.NET Webforms(最新版本)中构建的网页获取一些 JSON。我无法让异步部分工作。 GET 方法似乎永远挂起,或者 - 遵循 Microsoft 文档中的最佳实践方法 - 过了一会儿我得到了这个错误:
[TimeoutException: 异步操作超出页面 超时。] System.Web.UI.d__554.MoveNext() +984
我知道这与代码的等待/异步部分以及在 ASP.NET 中有关,原因如下。
- 如果我在控制台应用程序中使用非常相似的代码,它可以正常工作。
- 如果我使用 POSTMAN 调用 Web API,它可以正常工作。
我在 page 指令中设置了 async = true。这是我的页面加载
protected void Page_Load(object sender, EventArgs e)
{
try
{
RegisterAsyncTask(new PageAsyncTask(GetStuffAsync));
}
catch (Exception ex)
{
renderStoreCards.Text = ex.Message;
}
}
这是我的方法
private async Task GetStuffAsync()
{
string testHtml = string.Empty;
try
{
var signer = new AWS4RequestSigner("AccessKey", "SecretKey");
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://some-aws-address-changed-for-stack-overflow.execute-api.ap-southeast-2.amazonaws.com/Prod/tables/InSiteStoreInformation/ServerName")
};
request = await signer.Sign(request, "execute-api", "ap-southeast-2");
var client = new HttpClient();
var response = await client.SendAsync(request).ConfigureAwait(false);
string responseString = await response.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
renderStoreCards.Text = ex.Message;
}
}
上面的例子产生了一个 TimeoutException。在上述之前,我正在尝试以下代码。这适用于控制台应用程序,但不适用于 ASP.NET 页面。
class Program
{
static void Main(string[] args)
{
try
{
MainAsync().Wait();
}
catch (Exception ex)
{
Console.WriteLine($"Exception occured {ex.Message}");
Console.ReadKey();
}
}
static async Task MainAsync()
{
try
{
var signer = new AWS4RequestSigner("AccessKey", "SecretKey");
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://<Hiddenforstackoverflowpost>.execute-api.ap-southeast-2.amazonaws.com/Prod/tables/InSiteStoreInformation/ServerName")
};
request = await signer.Sign(request, "execute-api", "ap-southeast-2");
var client = new HttpClient();
var response = await client.SendAsync(request);
var responseStr = await response.Content.ReadAsStringAsync();
dynamic sales = Newtonsoft.Json.JsonConvert.DeserializeObject(responseStr);
Console.WriteLine($"Server = {sales[0].ServerName}");
Console.ReadKey();
Console.Write(responseStr);
Console.ReadKey();
}
catch (Exception ex)
{
throw (ex);
}
}
}
我绝不是异步/等待组合方面的专家,但我使用的 HttpClient 似乎没有同步替代方案,所以我必须弄清楚这一点。
【问题讨论】:
-
我应该指出,我整天都在用头撞砖墙。我根本无法让它发挥作用。这很令人沮丧,因为我花了大部分时间来设置一个非常好的 Web API,我可以使用路径参数等调用它,但我的整个计划取决于提供一个只会使用 Web API 的轻量级 ASP.NET Webforms 前端,获取 JSON 并根据该 JSON 数据呈现页面。我不知道为什么我不能像在控制台应用程序“测试”中那样使用 HttpRequestMessage。
-
不确定你的
RegisterAsyncTask对getAsync()做了什么,但由于它似乎永远挂起,它可能与here 描述的死锁有关。如果GetAsync()将在Page_Load上立即被调用,您可以尝试使事件方法异步并等待getAsync()。 -
您是否尝试过使用 Fiddler 之类的工具来查看线路上发生了什么?
-
嗨 Paulo,我确实尝试过 Fiddler,它显示了对 URL 的状态 200 调用,但我可以确认它永远不会到达 Web API,因为它在调用时记录了哪些记录,并且什么都没有火灾。我将再次尝试 Fiddler 并在我的问题中提供输出。还有迈克尔,我已经阅读了很多关于死锁场景的文章,并尝试了几种不同的方法,但似乎都没有奏效。我认为我可能已经尝试过您的建议,但我会专门这样做,如果它不起作用,我会再次使用我尝试的代码更新我的问题。
-
有没有人有使用 httprequwst essage 从 asp.net 页面到 web api 的示例,他们可以向我展示?一个有效的,理论上我可以使用的(所以如果它不起作用,我知道它不是这样的代码,可能是环境或其他东西)。我在这里不知所措,但我必须让它工作
标签: asp.net api web async-await