Windows IoT使用Windows.Web.Http时PostAsync后ReadAsStringAsync返回空如何解决
解决方案
原因说明
你遇到的空响应问题是Windows IoT平台下Windows.Web.Http库处理Transfer-Encoding: chunked编码的响应时,ReadAsStringAsync方法的兼容性缺陷导致的,即使服务端正常返回了内容,该方法也可能因为流读取逻辑异常返回空字符串。
修复步骤
方案1:改用Buffer读取后转字符串(兼容性最高)
将原来的string responseString = await response.Content.ReadAsStringAsync();替换为如下代码,需要先引入命名空间:
using System.Text; using Windows.Storage.Streams;
替换后的代码:
IBuffer responseBuffer = await response.Content.ReadAsBufferAsync(); byte[] responseBytes = responseBuffer.ToArray(); // 如果服务端返回的不是UTF-8编码,可替换为对应编码格式 string responseString = Encoding.UTF8.GetString(responseBytes, 0, responseBytes.Length); txtResponse.Text += " responseString: " + responseString;
方案2:手动读取响应流
也可以通过直接读取响应流的方式解析内容,需要引入命名空间using System.IO;:
using (var inputStream = await response.Content.ReadAsInputStreamAsync()) { using (var streamReader = new StreamReader(inputStream.AsStreamForRead(), Encoding.UTF8)) { string responseString = streamReader.ReadToEnd(); txtResponse.Text += " responseString: " + responseString; } }
补充排查项
如果以上方法还是返回空内容,可先检查以下配置:
- 给HttpClient添加和浏览器一致的Accept请求头,避免服务端因为请求头不匹配返回空内容:
httpClient.DefaultRequestHeaders.Accept.TryParseAdd("*/*"); - 打印
responseBytes.Length的值,如果值为0说明服务端确实返回了空内容,需要检查POST参数和凭证是否和浏览器请求完全一致。
内容的提问来源于stack exchange,提问作者Simple Simon
相关产品推荐
相关产品推荐

