【发布时间】:2013-07-11 05:27:36
【问题描述】:
我有一个使用 Web API 操作的异步方法。它似乎陷入了一个循环。我这样做的理由是,如果我在 catch 块的第 1 行设置一个断点并进入,它实际上永远不会到达第二行。
我最初返回一个包含 100,000+ (~30mb) 行的数据集,并认为由于请求的大小可能会很慢,但是在将我的 Web API 操作更改为仅返回 1 行之后,问题仍然存在.当我浏览到 Web API 解决方案的 URI 时,肯定会返回数据,我的浏览器中返回了 JSON。
public async Task<IEnumerable<Document>> GetAll()
{
try
{
var response = await _client.GetAsync(
string.Format("{0}/api/document", _baseURI));
// never hits line below
return await response.Content.ReadAsAsync<Document>()
as IEnumerable<Document>;
}
catch (Exception ex)
{
// handle exception
}
}
我不确定我是否在这里遗漏了什么?一些帮助将不胜感激。
编辑 1
在回答一些问题时,我有一个 MVC 项目引用的 Web API 项目。我不得不对 JSON 反序列化的原始问题进行一些更改。
存储库:
public async Task<IEnumerable<Document>> GetAll()
{
try
{
string json;
var response = await _client.GetAsync(string.Format(
"{0}/api/document", _baseURI)).ConfigureAwait(false);
var resource = await response.Content.ReadAsAsync<Document>();
using(var reader = new StreamReader(resource.ToString()))
{
json = reader.ReadToEndAsync().ToString();
}
return JsonConvert.DeserializeObjectAsync<Document>(json)
as IEnumerable<Document>;
}
catch (Exception)
{
throw;
}
}
控制器:
public async Task<ActionResult> GetAll()
{
return PartialView("_GetAllDocumentsPartial", await _docRepo.GetAll());
}
通过以下答案中描述的更改,在进行上述调试时仍然会出现相同的问题。但是我得到“任务被取消”。存储库中方法中的 catch 异常。
【问题讨论】:
-
从不写
throw ex。 stackoverflow.com/a/2999314/34397 -
你确定它永远不会打到第二行吗?异步和调试存在问题...您也可以尝试在第二行设置断点以确保。
-
是的,只是在此处放置了一个断点,但并没有击中它。 Chrome 只是继续加载/页面是空白的。
-
为了进一步巩固您对示例前面最后一句的断言,您是否尝试过使用 fiddler 来确保数据正在返回到您的实际应用程序?也就是说,假设你在一台机器上运行它,你可以在两者之间找到提琴手......
-
Fiddler 中没有返回 JSON。 GET 从未真正完成。尽管浏览到 URI 会直接返回 JSON,但该服务绝对可用。
标签: c# asp.net-mvc asynchronous asp.net-web-api async-await