我有一个.NET Core ASP.NET MVC 6应用程序,我确信它是Visual Studio中的一个错误。如果我在await语句后面放置一个断点,那么该对象不会显示在Locals中,并且我无法鼠标移动来检查。但是,如果我使用变量,它仍然可以正常工作,并且它确实填充了。
这么简单:
public async Task<IActionResult> Index()
{
var location = await _listingLocationService.GetLocationByAddress("123 Fake Street");
return Content(location.Latitude.ToString() + " " +location.Longitude.ToString());
}
如果我将断点放在return语句上,我无法检查位置。它并没有出现在任何地方。我甚至可以删除await&amp;放置一个。结果,但仍然没有显示。但是当我继续时,视图会显示location.latitude,并且location.longitude会很好。所以我知道它已被填充。
为了完整起见,我还要包含GetLocationByAddress函数,这也是同样的事情,如果我在等待之后的任何地方放置一个断点,我就无法检查变量(甚至是反序列化的)列出!)。
public async Task<Geolocation> GetLocationByAddress(string address)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://maps.googleapis.com/maps/api/geocode/json");
var request = new HttpRequestMessage(HttpMethod.Get, "?address=" + WebUtility.UrlEncode(address) + "&key=...");
var response = await client.SendAsync(request);
var contents = await response.Content.ReadAsStringAsync();
var locationResult = JsonConvert.DeserializeObject<GoogleLocationResult>(contents);
if (locationResult.status == "OK")
{
var result = locationResult.results.First().geometry.location;
return new Geolocation
{
Latitude = result.lat,
Longitude = result.lng
};
}
else
{
return null;
}
}
}
答案 0 :(得分:5)
嗯,在这个问题失去了一整天之后,我终于找到了问题的根源以及解决方案...... 在我的情况下,在更新我的项目以使用.net核心1.1预览1后,问题已经开始,遵循此处显示的步骤:Link to MSFT .NET Blog
问题是由project.json文件中的这行代码引起的:
"buildOptions": {
"debugType": "portable", <---- THIS
"preserveCompilationContext": true,
"emitEntryPoint": true
}
将“debugType”设置为“full”后,等待变量在调试时再次开始显示。
希望有人能帮助你!
答案 1 :(得分:-2)
这不是一个错误。当调试器到达返回行时,这是因为前一行立即返回了一个Task对象。你的GetLocation方法还没有运行(这是有意义的,因为它正在进行出站HTTP调用,它将花费的时间超过返回任务所花费的毫秒数)。当您点击返回行时,您的调试器已停在那里,但未完成的任务意味着该位置将不会就绪。放置断点的更好位置可能在GetLocation方法的返回行中。
顺便说一句,如果对Google地图的调用失败,您的操作方法会出现空引用错误。