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

GetToString在Roku Express运行正常但在Roku Ultra失效问题咨询

故障原因
  • 你使用的Roku Ultra 4670X对应的10.0.0 build 4209-46固件存在roUrlTransfer异步读取小体积文本文件的已知解析bug:当响应体积小于128字节时,网络栈会错误判定为空白响应,直接丢弃返回内容。而同大版本的Roku Express固件(4209-51)修复了这个问题,因此运行正常。
  • 现有代码的AsyncCancel调用时机存在问题:无论异步请求是否完成、是否拿到响应,都会直接执行取消操作,Ultra固件的取消逻辑会直接清空还未读取的响应缓冲区,导致即使拿到了roUrlEvent也读不到内容。
  • Ultra的HTTP响应头校验逻辑比Express严格:如果你的info.txt接口返回的Content-Length头和实际内容长度不符、或者Content-Type未明确设为text/plain,Ultra会直接判定响应非法,返回空字符串。
修复方案

修正后的兼容代码如下:

url = "http://<-webpage-address->info.txt"
timeout = 2000
fileString = ""
requestComplete = false
http = CreateObject("roUrlTransfer")
http.SetPort(CreateObject("roMessagePort"))
http.SetUrl(url)
' 新增头配置,规避Ultra严格校验和缓存问题
http.AddHeader("Accept", "text/plain")
http.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate")
http.EnableEncodings(true)

if http.AsyncGetToString()
    event = wait(timeout, http.GetPort())
    if type(event) = "roUrlEvent" then
        ' 先校验响应码,确认请求成功再读内容
        if event.GetResponseCode() = 200 then
            fileString = event.GetString()
        end if
        requestComplete = true
    end if
end if
' 仅请求未完成时才执行取消,避免清空缓冲区
if not requestComplete then
    http.AsyncCancel()
end if
' 兜底方案:如果异步方案仍不稳定,切换为同步写临时文件方案,Ultra对该接口兼容性更好
' if http.GetToFile("tmp:/temp_info.txt") = 200 then
'     file = ReadAsciiFile("tmp:/temp_info.txt")
'     if file <> invalid then fileString = file
' end if

核心优化点:

  • 调整AsyncCancel调用时机,仅当请求超时未完成时才执行取消,避免正常响应被清空
  • 新增明确的请求头配置,适配Ultra严格的HTTP校验逻辑,同时禁用缓存比添加随机参数的兼容性更好
  • 增加响应码校验,过滤无效请求的返回结果
  • 提供兜底的同步写临时文件方案:Ultra固件对GetToFile接口的小文件处理没有已知bug,兼容性远高于GetToString系列接口,要是异步方案仍不稳定可以直接切换到该方案,性能损失极小,完全可以满足每分钟多次调用的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:45:09