我有一个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,托管,默认)。 我也尝试了ReasAsStreamAsync()而不是ReadAsStringAsync(),但是得到了相同的结果。
当更改为https时,此问题会持续存在,但是会以另一种形式出现。内容有时不会是丢失的最后一个字节,而只是一个空字符串“”, 可能是因为无法解密邮件。
为了进行测试,我使用Visual Studio(Android 9)的x86模拟器以及Nexus 5(Android 6)。
答案 0 :(得分:0)
我想我找到了问题。 我正在与之交谈的嵌入式设备的服务器使用的是http / 1.0,并且不包含content-length。将其更改为使用http / 1.1并使用content-lenght可以为我解决此问题。 我只能猜测Xamarin.Android HttpClient的http / 1.0有问题。