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

Xamarin使用Launcher.OpenAsync传递base64报URI过长异常如何解决

原因说明

这个2000字符限制并非Xamarin专门设定,根源来自底层Mono运行时对Uri类的默认长度限制,该限制继承自早期.NET Framework的设计逻辑——早年主流浏览器普遍支持的URL最大长度约为2000字符,因此.NET系的Uri构造函数默认沿用了这个上限。从你提供的异常栈也可以看出,报错直接来自Mono的Uri.CreateThis方法,Xamarin.Essentials的Launcher.OpenAsync传入字符串时内部也会先实例化Uri对象,因此两种写法都会触发相同的异常。
另外URI Scheme本身的设计定位就不是用于传递大容量数据,图片转base64后体积会膨胀33%,哪怕只有几KB的小图转码后也很容易超过2000字符的限制。

可行替代方案

所有方案均不依赖本地文件存储,完全基于base64字符串传递:

  • 分平台原生接口传递(最推荐)
    放弃使用Launcher的URI调用方式,直接用对应平台的原生共享通道传递base64字符串,不存在长度限制:
    • Android端:直接构造Intent对象,将base64字符串放入Extra参数中传递给目标应用,示例代码:
      var intent = new Intent(Intent.ActionView);
      intent.SetPackage("目标应用的包名");
      intent.PutExtra("image_base64", 你的base64字符串);
      // 可根据目标应用要求补充其他Extra参数
      StartActivity(intent);
      
    • iOS端:若目标应用支持剪贴板读取,可先将base64写入系统剪贴板,再调用目标应用的URI Scheme传递简单的操作标识,目标应用收到请求后直接从剪贴板读取base64即可;也可以使用UIActivityViewController直接将base64作为数据项共享给目标应用。
  • 调整Uri最大长度限制(兼容性差,仅应急使用)
    你可以通过配置修改Mono运行时的Uri长度上限,将其调整到足够容纳你的base64字符串的大小:
    1. 在Android项目的Assets目录下新建app.config文件,添加如下配置:
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <system.net>
        <settings>
          <httpWebRequest maxUriLength="1048576" />
        </settings>
      </system.net>
    </configuration>
    
    1. 该配置将Uri最大长度调整为1MB,可满足大部分小图的base64传递需求。但该方案存在明显兼容性问题:即使你本地可以构造长Uri,大部分第三方应用的Uri解析逻辑也存在长度限制,大概率会出现你这边发出去、对方收不到的情况,因此仅当你完全确认目标应用支持长Uri时使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 06:42:02