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

如何解决WPF中Bing Maps导出KML时的“端口号应为整数”错误?

解决WPF WebBrowser中Bing Maps GeoXML导出KML时的“Port number should be an integer”错误

从你的描述来看,这个错误只在WPF WebBrowser控件结合C#回调时出现,单独运行HTML页面却完全正常,说明问题大概率出在WebBrowser控件的运行环境或者C#与JavaScript交互过程中的参数/上下文冲突上。以下是几个针对性的排查方向和解决方法:

1. 确认WebBrowser的IE兼容性与安全环境

虽然你提到已经设置了正确的IE版本,但WebBrowser控件的默认行为和独立IE浏览器存在差异:

  • 可以通过代码强制设置FEATURE_BROWSER_EMULATION注册表项,确保控件使用你测试过的IE版本(比如IE11),避免系统默认的兼容模式干扰:
    using Microsoft.Win32;
    
    private void SetBrowserEmulation()
    {
        var appExecutable = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
        using (var registryKey = Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", RegistryKeyPermissionCheck.ReadWriteSubTree))
        {
            registryKey.SetValue(appExecutable, 11001, RegistryValueKind.DWord); // 启用IE11标准模式
        }
    }
    
  • 在HTML页面头部添加<meta http-equiv="X-UA-Compatible" content="IE=edge">,强制控件使用最新的渲染引擎,避免因兼容模式导致的脚本异常。

2. 排查C#与JS交互中的URL/端口参数

错误提示指向“端口号应为整数”,推测是交互过程中某个涉及URL的参数被意外篡改或传递了异常值:

  • 检查所有从C#传递到JavaScript的参数,尤其是包含地图服务地址、回调URL这类内容的参数,确认端口部分是有效的整数,没有出现字母、空值或非数字字符。
  • 如果你的C#辅助类方法会返回URL相关内容,或者调用JS方法时传入了地址类参数,仔细核对参数格式是否符合标准URL规范。

3. 隔离GeoXML导出的执行上下文

既然单独运行HTML时导出正常,可以尝试让导出操作脱离C#回调的干扰:

  • 把导出KML的逻辑封装成独立的JS函数,避免在导出过程中触发C#回调:
    function exportMapToKml(mapInstance) {
        return new Promise((resolve, reject) => {
            Microsoft.Maps.loadModule('Microsoft.Maps.GeoXml', () => {
                try {
                    const kmlContent = Microsoft.Maps.GeoXml.write(mapInstance, { 
                        xmlFormat: Microsoft.Maps.GeoXmlFormat.kml, 
                        roundLocations: true, 
                        indentChars: ' ' 
                    });
                    resolve(kmlContent);
                } catch (error) {
                    reject(error);
                }
            });
        });
    }
    
  • 在C#中调用这个函数时,等待导出完成后再执行后续的回调操作,避免并行操作导致的上下文冲突。

4. 捕获更详细的错误线索

虽然你提到错误堆栈返回undefined,但可以通过以下方式获取更多信息:

  • 在C#中设置WebBrowser.ScriptErrorsSuppressed = false,关闭脚本错误抑制,这样能看到更具体的错误触发位置和上下文。
  • 在JS的catch块中添加更详细的日志输出:
    catch (e) {
        console.log('Error详情:', e.message, e.name);
        console.log('当前页面地址:', window.location.href);
        alert(`${e.message}\n错误类型: ${e.name}`);
    }
    

5. 先修复地图类型切换的脚本错误

你提到切换地图类型的下拉框悬停时存在脚本错误,这些潜在的异常可能破坏了Bing Maps的内部状态,进而导致后续的GeoXML导出失败。建议先修复这个下拉框的脚本问题,确保地图控件处于完全正常的状态后,再测试KML导出功能。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:56:39