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

从Hololens Unity端向Azure OCR服务发起HTTPS请求时出现异常报错

报错原因分析
  • IL2CPP 异常包装本质:你看到的Il2CppExceptionWrapper是Unity IL2CPP编译模式下,托管层C#代码抛出未捕获异常后,被Native层捕获包装的统一报错格式,核心问题是C#代码中存在未正确捕获的异常。
  • 异常捕获代码本身错误:你的catch块中调用的是Debug.log(小写l),C#大小写敏感,Unity官方API为Debug.Log(大写L),这导致原有异常抛出后,catch块本身又触发新的异常,最终没有完成异常捕获直接上报到Native层。
  • HTTP请求配置不符合规范:代码中设置了req.Expect = "application/json",HTTP协议中Expect头仅用于声明100-continue预期,传入非法值会导致Azure服务端直接拒绝请求,触发异常。
  • 异步调用阻塞导致死锁/异常:方法声明为async Task但全程没有使用await,反而用.Result同步阻塞异步方法,在Unity IL2CPP + UWP运行环境下极易触发线程死锁或未处理异常。
  • HTTPS证书校验/网络权限问题:Unity默认IL2CPP运行时可能未内置Azure服务的根证书,会触发HTTPS校验失败异常;另外UWP导出时如果没有开启Internet权限,也会导致网络请求被拦截。
解决方案
  • 修复基础错误
    把catch块的Debug.log改为Debug.Log(e.ToString()),打印完整异常栈,方便定位具体问题。
  • 移除非法请求头
    删除req.Expect = "application/json"这行无效配置。
  • 修正异步调用逻辑
    不要混合同步阻塞和异步调用,所有异步方法都加await关键字:
    // 替换写请求流代码
    using (var stream = await req.GetRequestStreamAsync())
    {
        await stream.WriteAsync(data, 0, data.Length);
    }
    // 替换获取响应代码
    using (HttpWebResponse response = (HttpWebResponse)await req.GetResponseAsync())
    using (var streamReader = new StreamReader(response.GetResponseStream()))
    {
        string json = await streamReader.ReadToEndAsync();
        Debug.Log("Response:"+json);
    }
    
    更推荐直接使用Unity原生的UnityWebRequest发起请求,对IL2CPP环境兼容性更高。
  • 配置HTTPS证书验证(调试阶段用)
    在发起请求前添加证书验证回调,跳过不必要的证书校验:
    System.Net.ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, error) => true;
    
    生产环境建议针对性验证Azure证书的哈希或颁发者,不要直接全局放行所有证书。
  • 检查Unity项目配置
    1. 打开玩家设置(Player Settings),把Api Compatibility Level设置为.NET 4.x / .NET Standard 2.1
    2. 导出UWP包时,在发布设置的权限栏勾选InternetClient权限
    3. 关闭IL2CPP的过度代码裁剪,或者把System.Net相关命名空间加入裁剪排除列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:09:04