Android/Xamarin.Android 将网络从 wifi 切换到 3g 时 rest 客户端超时
Android/Xamarin.Android rest client timeout when switching network from wifi to 3g
我的团队正在使用 Xamarin 表单(主要针对 phones)来处理一个依赖网络连接的项目。我们 运行 遇到了 android 上的一个问题,该问题阻碍了我们应用程序的一项主要功能。当我们在从 wifi 切换到蜂窝网络后尝试访问数据服务时,我们通常会在第一次数据检索尝试时收到超时错误。随后的尝试工作。 这个问题不会以相反的方式发生(从移动到 wifi)。 This bug describes our problem, but says it's for iOS, and interestingly enough we dont get this issue on iOS.
重现步骤列表如下:
- 使用 wifi
在 phone 上启动应用程序
- 尝试检索数据。这应该会导致成功
检索
- 使用快速设置栏(从屏幕顶部向下拉),打开
wifi 关闭,所以你正在使用蜂窝数据
- 尝试再次检索数据(尝试等待尽可能短或尽可能长
你想要....1秒,10秒,2分钟产生相同的
结果)。这应该会导致失败(在 servicestack 客户端上
它导致超时,在 httpclients 上它导致
OperationCancelledException,它下面是一个超时)
- 尝试检索数据并在
第一次尝试,再试一次,你应该会成功。
我们更喜欢在我们的应用程序中使用 ServiceStack 客户端,因为它隐藏了很多复杂的代码。通过对该问题的研究,大量信息表明我们可以使用名为 ModernHttpClient 的库(此错误描述了我们的确切步骤,但据报告与 iOS 相关),但这并不能解决我们的问题。
也可以在此处找到这些步骤的视频截屏要查看此视频的示例截屏,请观看此视频 https://drive.google.com/open?id=0B9ulyVqWgbL3aEUzVFJEYTF2dEk。
可以在 https://drive.google.com/open?id=0B9ulyVqWgbL3UHZmX2x6NDBEY00
找到上述屏幕截图中使用的简单示例应用程序
你们中有人知道这是 Android OS 问题、单声道问题还是代码问题...或其中几个问题的组合?有解决办法吗?
编辑:另一种尝试的场景很有趣。
- 使用 wifi
在 phone 上启动应用程序
- 尝试检索数据。这应该会导致成功
检索
- 使用快速设置栏(从屏幕顶部向下拉),打开
wifi 关闭,所以你正在使用蜂窝数据
- 进入飞行模式
- 退出飞行模式
- 再次尝试检索数据。这将导致成功
问题是客户端在更改网络后重新使用连接,当然连接无效。
您可以通过将 HttpWebRequest 的 KeepAlive 设置为 false 来添加 "content: closed",但是无法从 PCL 程序集完成。
因此必须创建PCL到ios/android项目的Dependency,向native端发送请求,设置KeepAlive为false,return,这样连接将关闭,当您创建新连接时,它将位于新网络上。
我的团队正在使用 Xamarin 表单(主要针对 phones)来处理一个依赖网络连接的项目。我们 运行 遇到了 android 上的一个问题,该问题阻碍了我们应用程序的一项主要功能。当我们在从 wifi 切换到蜂窝网络后尝试访问数据服务时,我们通常会在第一次数据检索尝试时收到超时错误。随后的尝试工作。 这个问题不会以相反的方式发生(从移动到 wifi)。 This bug describes our problem, but says it's for iOS, and interestingly enough we dont get this issue on iOS.
重现步骤列表如下:
- 使用 wifi 在 phone 上启动应用程序
- 尝试检索数据。这应该会导致成功 检索
- 使用快速设置栏(从屏幕顶部向下拉),打开 wifi 关闭,所以你正在使用蜂窝数据
- 尝试再次检索数据(尝试等待尽可能短或尽可能长 你想要....1秒,10秒,2分钟产生相同的 结果)。这应该会导致失败(在 servicestack 客户端上 它导致超时,在 httpclients 上它导致 OperationCancelledException,它下面是一个超时)
- 尝试检索数据并在 第一次尝试,再试一次,你应该会成功。
我们更喜欢在我们的应用程序中使用 ServiceStack 客户端,因为它隐藏了很多复杂的代码。通过对该问题的研究,大量信息表明我们可以使用名为 ModernHttpClient 的库(此错误描述了我们的确切步骤,但据报告与 iOS 相关),但这并不能解决我们的问题。
也可以在此处找到这些步骤的视频截屏要查看此视频的示例截屏,请观看此视频 https://drive.google.com/open?id=0B9ulyVqWgbL3aEUzVFJEYTF2dEk。 可以在 https://drive.google.com/open?id=0B9ulyVqWgbL3UHZmX2x6NDBEY00
找到上述屏幕截图中使用的简单示例应用程序你们中有人知道这是 Android OS 问题、单声道问题还是代码问题...或其中几个问题的组合?有解决办法吗?
编辑:另一种尝试的场景很有趣。
- 使用 wifi 在 phone 上启动应用程序
- 尝试检索数据。这应该会导致成功 检索
- 使用快速设置栏(从屏幕顶部向下拉),打开 wifi 关闭,所以你正在使用蜂窝数据
- 进入飞行模式
- 退出飞行模式
- 再次尝试检索数据。这将导致成功
问题是客户端在更改网络后重新使用连接,当然连接无效。
您可以通过将 HttpWebRequest 的 KeepAlive 设置为 false 来添加 "content: closed",但是无法从 PCL 程序集完成。
因此必须创建PCL到ios/android项目的Dependency,向native端发送请求,设置KeepAlive为false,return,这样连接将关闭,当您创建新连接时,它将位于新网络上。