GameFramework UnityWebRequest提示错误:A Native Collection has not been disposed....

错误代码:

/// <summary>
        /// 通过 Web 请求代理辅助器发送请求。
        /// </summary>
        /// <param name="webRequestUri">要发送的远程地址。</param>
        /// <param name="userData">用户自定义数据。</param>
        public override void Request(string webRequestUri, object userData)
        {
            if (m_WebRequestAgentHelperCompleteEventHandler == null || m_WebRequestAgentHelperErrorEventHandler == null)
            {
                Log.Fatal("Web request agent helper handler is invalid.");
                return;
            }
            WWWFormInfo wwwFormInfo = (WWWFormInfo)userData;
            if (wwwFormInfo.WWWForm != null)
            {
                m_UnityWebRequest = UnityWebRequest.Post(webRequestUri, wwwFormInfo.WWWForm);
            }
            else if (wwwFormInfo.JsonData != null)
            {
                m_UnityWebRequest = UnityWebRequest.Post(webRequestUri, "POST");
                m_UnityWebRequest.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
                m_UnityWebRequest.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(wwwFormInfo.JsonData));
            }
            else
            {
                m_UnityWebRequest = UnityWebRequest.Get(webRequestUri);
            }

            SendWebRequest();
        }

错误原因

具体原因不明,总之加了这行代码就会有问题,有大佬知道的请评论指导下,蟹蟹

m_UnityWebRequest.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(wwwFormInfo.JsonData));

解决办法

将Post方法中的第二个参数改成WWWFrom类型的

m_UnityWebRequest = UnityWebRequest.Post(webRequestUri, wwwFormInfo.WWWForm);
                m_UnityWebRequest.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
                m_UnityWebRequest.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(wwwFormInfo.JsonData));

最后

因为整体代码和上面有些重复,修改了下,完整代码

/// <summary>
        /// 通过 Web 请求代理辅助器发送请求。
        /// </summary>
        /// <param name="webRequestUri">要发送的远程地址。</param>
        /// <param name="userData">用户自定义数据。</param>
        public override void Request(string webRequestUri, object userData)
        {
            if (m_WebRequestAgentHelperCompleteEventHandler == null || m_WebRequestAgentHelperErrorEventHandler == null)
            {
                Log.Fatal("Web request agent helper handler is invalid.");
                return;
            }
            WWWFormInfo wwwFormInfo = (WWWFormInfo)userData;
            if (wwwFormInfo.WWWForm != null)
            {
                m_UnityWebRequest = UnityWebRequest.Post(webRequestUri, wwwFormInfo.WWWForm);
            }
            else
            {
                m_UnityWebRequest = UnityWebRequest.Get(webRequestUri);
            }

            if (wwwFormInfo.JsonData != null)
            {
                m_UnityWebRequest.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
                m_UnityWebRequest.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(wwwFormInfo.JsonData));
            }

            SendWebRequest();
        }

其它

网上找到的方法时使用using定义WebRequest的作用范围,执行结束时自动释放,或者手动释放WebRequest。如下:

public static IEnumerator UnityWebRequestPost(string url, string json, Action<string> acticn)
    {
        using (UnityWebRequest www = UnityWebRequest.Post(url, json))
        {
 
            www.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
            byte[] bodyRaw = Encoding.UTF8.GetBytes(json);
            www.uploadHandler = new UploadHandlerRaw(bodyRaw);
            yield return www.SendWebRequest();
            if (www.result == UnityWebRequest.Result.ProtocolError || www.result == UnityWebRequest.Result.ConnectionError)
            {
                Debug.LogError($"发起网络请求失败: 确认过闸接口 -{www.error}");
            }
            else
            {
                Debug.Log(www.downloadHandler.text);
                acticn?.Invoke(www.downloadHandler.text);
            }
        }
    }

显然这个方法不适用于我们这个需求,这样要改得地方太多了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值