You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#使用BingMapsRESTToolkit请求路线添加出发时间参数时报反序列化异常

故障根因
  • 异常提示的ï不是返回内容里的可见字符,是**UTF-8 BOM(字节顺序标记)**被错误编码解析的产物:当路线请求同时配置了出发时间、开启了途经点TSP优化时,Bing Maps服务会走异步计算流程,最终计算结果存储在Blob存储中,返回的JSON文件默认携带UTF-8 BOM头(字节序列为0xEF 0xBB 0xBF),反序列化逻辑如果没有提前处理BOM,会把首字节0xEF识别为非法字符ï。浏览器访问结果地址看不到这个字符,是因为浏览器会自动识别并过滤BOM头。
  • 所用BingMapsRESTToolkit版本存在逻辑缺陷:处理异步返回的Blob结果时,没有做BOM检测和跳过就直接传入反序列化器,才触发该错误。代码中ticks写法的时间值和注释里的new DateTime(2022, 07, 04, 8, 45, 0)完全等价,时间参数本身没有问题;未配置出发时间时请求走同步返回通道,响应不带BOM,所以可以正常运行。
  • 异常信息里提示反序列化类型为DistanceMatrix是工具包内部逻辑导致:开启途经点优化时,工具包会先异步请求距离矩阵接口计算最优途经点顺序,出错点发生在距离矩阵结果拉取阶段,还没走到最终路线生成的步骤。
修复方案
  • 优先升级BingMapsRESTToolkit到最新正式版本,新版本已经修复了异步结果读取时未处理UTF-8 BOM的兼容问题。
  • 如果暂时无法升级依赖包,可以自行实现异步结果拉取逻辑:下载Blob结果流时,使用StreamReader指定UTF-8编码并自动检测BOM头,拿到完整的合法JSON字符串后再执行反序列化,替换掉工具包内置的Execute()方法中对应异步处理的逻辑。
  • 如果业务上不需要自动优化途经点顺序,直接删除WaypointOptimization = BingMapsRESTToolkit.Extensions.TspOptimizationType.TravelDistance配置即可——当前示例只有起止两个途经点,本身没有顺序优化的必要,删除配置后请求会走同步计算接口,不会触发异步Blob结果拉取逻辑,问题可直接复现消除。
问题复现代码
public List<Route> responseList;
static string key = "mykey";

private async void buttonSearch_Click(object sender, EventArgs e)
{
    responseList = new List<Route>();
    var request = new RouteRequest()
    {
        Waypoints = new List<SimpleWaypoint>() {
            new SimpleWaypoint(39.951916, -75.150118),
            new SimpleWaypoint(40.745702, -73.847184)
        },
        WaypointOptimization = BingMapsRESTToolkit.Extensions.TspOptimizationType.TravelDistance,
        RouteOptions = new RouteOptions()
        {
            TravelMode = TravelModeType.Driving,
            TimeType = RouteTimeType.Departure,
            //DateTime = new DateTime(2022, 07, 04, 8, 45, 0)
            DateTime = new DateTime(637925211000000000)
        },
        BingMapsKey = key
    };

    // 此处抛出反序列化异常
    var response = await request.Execute();

    if (response != null &&
        response.ResourceSets != null &&
        response.ResourceSets.Length > 0 &&
        response.ResourceSets[0].Resources != null &&
        response.ResourceSets[0].Resources.Length > 0)
    {
        responseList.Add(response.ResourceSets[0].Resources[0] as BingMapsRESTToolkit.Route);

        // 处理返回结果
        richTextBox1.Text += "TravelDistance: " + responseList[0].RouteLegs[0].TravelDistance + Environment.NewLine;
        richTextBox1.Text += "TravelDuration: " + responseList[0].RouteLegs[0].TravelDuration + Environment.NewLine;
    }
}

内容的提问来源于stack exchange,提问作者Apache359

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 01:39:18