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

.NET MAUI Windows桌面应用实现无弹窗Basic认证加载地图

可行,而且不用手动写HTTP请求——ArcGIS Runtime本身就支持配置自动添加Basic认证头,直接解决弹窗问题,还更可靠。

你现有代码的问题

你手动发起的HTTP请求只是做了一次验证,但ArcGIS Runtime的WmtsLayer内部会自行发起瓦片加载请求,这个请求不会继承你手动创建的HttpClient的认证头,所以你的代码其实没解决图层加载时的认证问题,反而多了无用的请求。


正确实现方式:配置ArcGIS Runtime自动提供Basic认证

步骤1:修改MauiProgram.cs的ArcGIS配置

重新配置认证模块,添加针对目标服务的Basic凭证,让所有该服务的请求自动带上认证头,避免弹窗:

.UseArcGISRuntime(config => config
    .ConfigureAuthentication(auth =>
    {
        // 获取你的API Key
        var apiKey = Keys.Instance["Settings:API-key"];
        // 为WMTS服务添加Basic凭证(用户名=API Key,密码留空)
        auth.AddCredential(new BasicCredential(
            "https://avoin-karttakuva.maanmittauslaitos.fi/avoin/wmts/", 
            apiKey, 
            string.Empty
        ));
        // 移除UseDefaultChallengeHandler,避免触发弹窗
    })
)
.UseArcGISToolkit();

步骤2:简化ViewMap.cs代码

不需要手动发HTTP请求,直接创建图层即可——认证逻辑已经由ArcGIS Runtime自动处理:

public static class ViewMap
{
    public static void LoadWMTSLayer(MapView MyMapView)
    {
        try
        {
            var apiKey = Keys.Instance["Settings:API-key"];
            Map myMap = new();
            
            // 使用服务的元数据地址创建图层,Runtime会自动解析瓦片规则
            Uri wmtsServiceUri = new("https://avoin-karttakuva.maanmittauslaitos.fi/avoin/wmts/1.0.0/WMTSCapabilities.xml");
            WmtsLayer myWmtsLayer = new WmtsLayer(wmtsServiceUri, "taustakartta");
            
            myMap.Basemap.BaseLayers.Add(myWmtsLayer);
            MyMapView.Map = myMap;
        }
        catch (Exception ex)
        {
            Application.Current.MainPage.DisplayAlert("Error", ex.ToString(), "OK");
        }
    }
}

方案解释

  • AddCredential会将Basic凭证缓存到ArcGIS Runtime的认证管理器中,当请求匹配到指定的服务地址前缀时,自动添加Authorization: Basic <base64编码的apiKey:>头。
  • 使用服务的Capabilities地址创建WmtsLayer,Runtime会自动解析服务元数据,加载正确的瓦片,所有瓦片请求都会自动带上认证头。

备选:动态提供凭证(更灵活)

如果你的API Key是动态获取的,或者需要匹配多个服务,可以用自定义凭证请求处理器:

.UseArcGISRuntime(config => config
    .ConfigureAuthentication(auth =>
    {
        auth.UseCredentialRequestHandler(async (credentialRequestInfo) =>
        {
            // 匹配目标服务域名
            if (credentialRequestInfo.ServiceUri.Host == "avoin-karttakuva.maanmittauslaitos.fi")
            {
                var apiKey = Keys.Instance["Settings:API-key"];
                return new BasicCredential(credentialRequestInfo.ServiceUri, apiKey, string.Empty);
            }
            // 其他服务返回null,按默认逻辑处理
            return null;
        });
    })
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 12:07:37