【发布时间】:2016-05-01 14:57:48
【问题描述】:
我正在处理一个 ASP.NET 项目,我正在使用我们创建的自定义 REST 服务来获取该站点的 JSON 数据。我正在使用 HTTPClient 来调用 REST 服务。但是当我调用我在下面创建的 ProcessRestMethod 例程时,有时任务会返回正确的结果,但有时任务不会完成执行并且例程会返回。我在异步调用中缺少什么?我的 ProcessRestMethod 代码如下。谢谢:
private string ProcessRestMethod(string methodName, string parameters)
{
string result = "";
using (HttpClient httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
string strParams = parameters;
if ((!String.IsNullOrEmpty(parameters)) && (parameters.IndexOf('?') != 0))
strParams = "?" + parameters;
var task = httpClient.GetStringAsync(baseUri + methodName + strParams);
task.Wait();
task.ContinueWith((t) =>
{
var tresult = t.Result;
result = tresult;
});
}
if (result == "")
result = "{\"status\":{\"code\":1000,\"message\":\"Unkown Error Ocured\"}}";
return result;
}
【问题讨论】:
-
我不确定您为什么要以如此复杂的方式执行此操作,但无论如何,您永远不会等待继续。有时,它可能会在您到达
if (result == "")之前运行,有时则不会。 -
你为什么不用
async/await?您现在所做的只是浪费 两个 线程,而不是让 ASP.NET 在执行 GetStringAsync 时重用原始线程 -
此外,如果您关心错误,请使用
GetAsync并检查响应状态。在绝大多数情况下,这些都是众所周知的错误,例如路径错误、未经授权等 -
@PanagiotisKanavos:如果代码未经授权、404 等(配置错误)编码,则代码不太可能自行纠正。因此,获取特定异常无济于事。其次,IIRC HttpClient 只有一个异步接口,因此必须使用该功能。使用它并不意味着 async/await 是最好的解决方案(如果调用树顶部的所有内容都是同步的)
-
@jgauffin 首先,没有说任何关于异常的事情。其次,404 不是配置 错误——它可能意味着文件还没有。或者 403 可能意味着使用了错误的帐户。或 429 - 请求过多等。忽略这些并返回“未知错误”几乎是一个错误。关于接口的评论也不正确 - 使用 HttpClient 意味着您已经异步。在任何情况下,决定
async是否是一个好选择的是下面的内容。如果上面的代码不是异步的,你可以选择模仿同步执行,或者修改它以利用异步
标签: c# asp.net async-await httpclient dotnet-httpclient