使用BingMapsRESTToolkit计算两地距离时缺少最终步骤求助
解决BingMapsRESTToolkit获取两地距离的问题
你离成功真的只差一步!核心误区在于:DistanceMatrixRequest.Execute()方法返回的是DistanceMatrixResponse响应对象,所有距离数据都存在这个返回值里,而非原请求对象dm中。另外你遇到的调试时await后莫名跳出方法的情况,大概率是请求过程中抛出了未被捕获的异常(比如密钥无效、网络问题、地址解析失败等)。
下面是修正后的完整代码,我会拆解关键要点:
async Task<double> CalculateDistanceWithBingAPI(string from, string to, DataRow row) { double result = 0; try { var dm = new DistanceMatrixRequest(); dm.BingMapsKey = Settings.BingKey; dm.TravelMode = TravelModeType.Truck; // 简化集合初始化写法 dm.Origins = new List<SimpleWaypoint> { new SimpleWaypoint(from) }; dm.Destinations = new List<SimpleWaypoint> { new SimpleWaypoint(to) }; // 重点:接收Execute()返回的响应对象,这才是存储结果的地方 var response = await dm.Execute(); // 逐层验证响应的有效性,避免空引用异常 if (response.StatusCode == System.Net.HttpStatusCode.OK && response.ResourceSets != null && response.ResourceSets.Any() && response.ResourceSets.First().Resources != null && response.ResourceSets.First().Resources.Any()) { // 因为你只传了1个起点和1个终点,直接取第一个结果即可 var distanceMatrix = response.ResourceSets.First().Resources.First() as DistanceMatrix; if (distanceMatrix != null && distanceMatrix.Rows.Any() && distanceMatrix.Rows.First().Elements.Any()) { var distanceElement = distanceMatrix.Rows.First().Elements.First(); // TravelDistance默认单位是公里,可根据需求转换(比如转英里) result = distanceElement.TravelDistance; row["Distance"] = result; } } else { // 处理请求失败场景,打印错误信息便于排查 Console.WriteLine($"请求失败: {response.StatusDescription}"); } } catch (Exception ex) { // 捕获异常,避免调试时莫名跳出方法,同时记录错误信息 Console.WriteLine($"计算距离时出错: {ex.Message}"); // 这里也可以添加日志记录逻辑 } return result; }
关键细节说明:
- 响应层级结构:Bing Maps距离矩阵的响应是嵌套结构:
ResourceSets→Resources(类型为DistanceMatrix) →Rows→Elements,每个Element包含TravelDistance(距离)、TravelDuration(行驶时长)等核心属性。 - 异常处理:添加
try-catch能捕获所有潜在异常(比如网络波动、密钥错误),调试时就不会再出现await后直接跳出方法的情况。 - 空值校验:逐层做空值验证很重要,毕竟API响应可能因地址无法解析、配额不足等原因返回不完整数据。
另外调试小技巧:如果还是遇到异常未捕获的情况,可以在Visual Studio中按Ctrl+Alt+E打开异常设置,勾选「Common Language Runtime Exceptions」,这样就能捕获所有未处理的异常,快速定位问题根源。
内容的提问来源于stack exchange,提问作者GuidoG
相关产品推荐
相关产品推荐

