【发布时间】:2019-06-14 17:59:13
【问题描述】:
我有一个 Xamarin.Forms 应用程序,它应该通过 RESTService 与嵌入式设备进行通信。 所以在我的 SharedProject 中,我有一个包装了 httpclient 的服务。
HttpClient client = new HttpClient() { Timeout = new TimeSpan(0, 0, 31) };
public async Task<MetaData> RequesMetaData()
{
try
{
var response =await client.GetAsync("http://192.168.1.23:9090/api/meta/", HttpCompletionOption.ResponseContentRead);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
var meta = JsonConvert.DeserializeObject<MetaData>(result);
return meta;
}
catch(OperationCanceledException ocex)
{
ConnectionError?.Invoke(new Message { MessageInfo = ocex.Message, IsError = true });
return new MetaData();
}
catch(Exception ex)
{
ConnectionError?.Invoke(new Message { MessageInfo = ex.Message, IsError = true });
Debug.Print(ex.GetType().Name);
return new MetaData();
}
}
调用应该返回一个 Json,这在大多数情况下都有效。 问题是有时,Json 的最后一个字节,大括号'}' 丢失。 无论服务器发送的消息有多长,它始终是最后一个 '}'。
这只发生在 Android 上。当我从 Firefox 测试 REST 服务时, 不会发生此类错误。此外,我使用 Wireshark 登录,它报告完整的 json 是通过网络传递的。 我还在 WPF 桌面应用程序中尝试了相同的代码,它完美无缺。仅在 Xamarin Android 上它缺少最后一个字节。在 Android 选项中, 我尝试了所有选项(Android、托管、默认)。 除了 ReadAsStringAsync(),我还尝试了 ReasAsStreamAsync(),但得到了相同的结果。
更改为 https 时,此问题仍然存在,但以另一种形式存在。而不是丢失的最后一个字节,有时内容将只是一个空字符串“”, 可能是因为消息无法解密。
为了测试,我使用 VisualStudio(Android 9) 的 x86 Emulator 以及 Nexus 5 (Android 6)。
【问题讨论】:
-
如果你使用
ReadAsStreamAsync,然后用StreamReader读取流,会不会出现这种情况?我想知道它是否存在任何翻译层中的某种错误(我不太熟悉 Xamarin 的工作原理)。 -
是的,我也试过ReadAsStreamAsync+ StreamReader,结果一样,最后一个字节不见了。
-
@SigiN,通过我的搜索,很多文章建议使用ReadAsStreamAsync和streamReader从json中获取数据,这个没有问题:johnthiriet.com/efficient-api-calls/#
标签: c# android http xamarin xamarin.forms