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

Xamarin Forms动态传递URL时抛出Uri无效参数异常求助

解决Xamarin动态拼接Uri时的ArgumentException问题

问题分析

静态URL运行正常,但从Preferences读取语言值拼接成查询字符串后抛出System.ArgumentException(提示Uri值无效),核心原因集中在两点:

  • 从Preferences取出的语言值包含未编码的特殊字符(如非ASCII字符、空格、&等),Uri对这类字符有严格格式要求
  • 拼接后的URL存在格式错误(比如重复的?/&,或参数值为空)

解决方案

1. 对语言参数值进行URL编码

Uri的查询参数值必须经过URL编码,避免特殊字符破坏Uri结构。使用Uri.EscapeDataString()方法处理取出的语言值:

// 读取语言设置,设置合理默认值
string lang = Preferences.Get("SelectedLanguage", "en");
// 对语言值进行URL编码,适配Uri规范
string encodedLang = Uri.EscapeDataString(lang);

// 方式1:直接拼接(注意原URL已有查询参数,用&连接新参数)
string validUrl = $"{_getCategories}&lang={encodedLang}";

// 方式2:用UriBuilder构造,自动处理格式问题,更安全
UriBuilder uriBuilder = new UriBuilder(_getCategories);
string existingQuery = uriBuilder.Query.TrimStart('?');
string newQuery = string.IsNullOrEmpty(existingQuery) 
    ? $"lang={encodedLang}" 
    : $"{existingQuery}&lang={encodedLang}";
uriBuilder.Query = newQuery;

// 最终得到合法Uri
Uri finalUri = uriBuilder.Uri;

2. 排查Preferences中的语言值

  • 调试时打印Preferences.Get("SelectedLanguage", "")的返回值,确认是否为空、包含空格或乱码字符
  • 检查保存语言值的代码,确保存入的是规范语言代码(如zh-CN、en-US),无多余符号或空格

3. 验证最终Uri格式

拼接完成后打印最终URL字符串,确认:

  • 没有重复的?(原URL已有?,新参数必须用&连接)
  • 参数值无未编码的特殊字符

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:06:03