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
相关产品推荐
相关产品推荐

