c# - 更新应用程序后 Web 请求上的 Xamarin iOS HttpRequestException “Connection reset by peer”
问题描述
我们有一个基于 Apple Enterprise Developer 的自托管 iOS 应用程序,大约在六周前发布。我们正在开发该应用程序的下一个版本,并在人们更新到新的测试版本时发现问题。每当通过包含不记名令牌的 HTTPS 进行调用时,都会引发 HttpRequestException 并带有“对等方重置连接”消息。MS App Center 错误报告中显示的调用堆栈提供的信息很少。
Main thread
System.Net.Sockets
Socket.Receive (System.Byte[] buffer, System.Int32 offset, System.Int32 size, System.Net.Sockets.SocketFlags socketFlags)
System.Net.Sockets
NetworkStream.Read (System.Byte[] buffer, System.Int32 offset, System.Int32 size)
使用户登录的初始 Web 请求似乎正在运行。这是唯一在标题中不包含不记名令牌的请求。给定会话中的所有后续请求都会引发此异常。
我们发现用户可以通过在安装新版本之前从手机中删除当前发布的应用版本来解决该错误。完成后,新版本中不再出现该错误。我们还收到了一些关于用户即使没有升级应用程序版本也会收到错误的报告。在一段时间未使用该应用程序后,这些用户似乎会发生这种情况。
我们已尝试按照在我们设备上的已发布版本之上安装新测试版本的相同步骤来重现该错误,并且它工作正常。
我们的项目经理在她的个人设备上遇到了问题。她一直在测试新版本而不升级,看看是否不再抛出异常。我们尝试了以下方法来解决问题,但没有成功:
- 删除了以前 Web 请求结果和不记名令牌的所有本地缓存,始终强制实时请求
- 从 HttpClient 的 iOS NSUrlSession 实现切换回默认的 Xamarin 托管实现
- 验证 HttpClient 基本 URI 和单个请求 URI 是否符合预期
- 在进行调用时验证承载令牌值是否已分配给 HttpClient Authorization 默认标头
有没有人发生过这种情况,或者可以阐明引发此异常的可能原因?非常感谢您提供的任何帮助。它快把我们逼疯了!
这是其中一个请求调用的示例。HttpClient 属性是用于应用程序生命周期的静态实例。SaveContext 属性是一个布尔值,用于启用/禁用上下文保存,以测试在后台线程中执行请求而不保存上下文。这两个选项都已尝试过,并且对发生的错误没有影响。HttpClient BaseAddress 属性具有分配给它的 API uri 根。传递给 GetAsync 的 uri 是一个相对 uri。
HttpResponseMessage serverResponse = await HttpClient.GetAsync(uri).ConfigureAwait(SaveContext);
这是更多的设置:
var handler = new HttpClientHandler {
AllowAutoRedirect = true, AutomaticDecompression =
DecompressionMethods.Deflate | DecompressionMethods.GZip,
MaxAutomaticRedirections = 20
};
var httpClient = new HttpClient(handler);
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(JsonSerializerHelper.JsonEncoding));
HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
解决方案
推荐阅读
- datalog - 数据记录着色对象
- awk - 使用带有两个不同分隔符的 awk 来拆分和选择列
- c# - Unity C# REST PUT 请求正文在服务器端为空白
- javascript - 使用 JavaScript 更改 CSS 样式表中的规则
- vagrant - Vagrant 磁盘分区与 Debian 文件系统不匹配(分区较大)
- perl - 从模式到 TSV 的 Json
- git - 尽管文件夹发生了变化,git 不允许我推送文件
- java - 制作自定义 JTableModel 以监听 ArrayList 中的变化
- asp.net-mvc - 如何将 mvc 页面用作 Angular 5 templateUrl
- bluetooth - UART模块和运算