HttpClient在response.content中缺少最后一个字节

时间:2019-06-13 05:31:27

标签: c# android http xamarin xamarin.forms

我有一个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)。

1 个答案:

答案 0 :(得分:0)

我想我找到了问题。 我正在与之交谈的嵌入式设备的服务器使用的是http / 1.0,并且不包含content-length。将其更改为使用http / 1.1并使用content-lenght可以为我解决此问题。 我只能猜测Xamarin.Android HttpClient的http / 1.0有问题。