java.io.IOException:流已重置:REFUSED_STREAM 在多个设备上
java.io.IOException: stream was reset: REFUSED_STREAM on several devices
我在 Android 应用程序中使用 Retrofit 1.9。
服务器在带有 Nginx 的 Django 上,带有 HTTP 2 的 HTTPS。证书来自 WoSign,"A" SSL Labs 得分。
我正在 3 台设备上进行测试:
- Nexus 4,Android 5.1.1(官方)
- Nexus 9,Android7.0(官方)
- 三星 Galaxy S3,Android 4.4(官方)
在 SGS3 上运行良好,但在 Nexus 4 和 9 上出现异常:
java.io.IOException: stream was reset: REFUSED_STREAM
at com.squareup.okhttp.internal.framed.FramedStream.getResponseHeaders(FramedStream.java:146)
at com.squareup.okhttp.internal.http.Http2xStream.readResponseHeaders(Http2xStream.java:150)
at com.squareup.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:737)
at com.squareup.okhttp.internal.http.HttpEngine.access0(HttpEngine.java:87)
at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:722)
at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:576)
at com.squareup.okhttp.Call.getResponse(Call.java:287)
at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:243)
at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:205)
at com.squareup.okhttp.Call.execute(Call.java:80)
at retrofit.client.OkClient.execute(OkClient.java:53)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:326)
at retrofit.RestAdapter$RestHandler.access0(RestAdapter.java:220)
at retrofit.RestAdapter$RestHandler.obtainResponse(RestAdapter.java:278)
at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at retrofit.Platform$Android.run(Platform.java:142)
at java.lang.Thread.run(Thread.java:761)
我已经解决了这个问题。这是一个 Nginx bug
此问题已在 Nginx 1.11 中修复。所以,解决办法就是更新到 NGINX 1.11(目前是主线)。
在我的例子中,nginx 已经更新到 1.11.x。对我来说,罪魁祸首是 okhttp 和改造。当我尝试发出 PUT 请求时,它会失败 stream was reset: REFUSED_STREAM
。
为了解决这个问题,我升级到两者的最新版本,在我写这篇文章的时候是:
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.okhttp3:okhttp:3.5.0'
如果您使用的是 retrofit 2.0.x 或 okhttp 3.1.x,升级应该可以解决问题。
如果还有人遇到问题(2018)。
我已通过将改装版本更新为
解决了该问题
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
我在 Android 应用程序中使用 Retrofit 1.9。
服务器在带有 Nginx 的 Django 上,带有 HTTP 2 的 HTTPS。证书来自 WoSign,"A" SSL Labs 得分。
我正在 3 台设备上进行测试:
- Nexus 4,Android 5.1.1(官方)
- Nexus 9,Android7.0(官方)
- 三星 Galaxy S3,Android 4.4(官方)
在 SGS3 上运行良好,但在 Nexus 4 和 9 上出现异常:
java.io.IOException: stream was reset: REFUSED_STREAM
at com.squareup.okhttp.internal.framed.FramedStream.getResponseHeaders(FramedStream.java:146)
at com.squareup.okhttp.internal.http.Http2xStream.readResponseHeaders(Http2xStream.java:150)
at com.squareup.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:737)
at com.squareup.okhttp.internal.http.HttpEngine.access0(HttpEngine.java:87)
at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:722)
at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:576)
at com.squareup.okhttp.Call.getResponse(Call.java:287)
at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:243)
at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:205)
at com.squareup.okhttp.Call.execute(Call.java:80)
at retrofit.client.OkClient.execute(OkClient.java:53)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:326)
at retrofit.RestAdapter$RestHandler.access0(RestAdapter.java:220)
at retrofit.RestAdapter$RestHandler.obtainResponse(RestAdapter.java:278)
at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at retrofit.Platform$Android.run(Platform.java:142)
at java.lang.Thread.run(Thread.java:761)
我已经解决了这个问题。这是一个 Nginx bug
此问题已在 Nginx 1.11 中修复。所以,解决办法就是更新到 NGINX 1.11(目前是主线)。
在我的例子中,nginx 已经更新到 1.11.x。对我来说,罪魁祸首是 okhttp 和改造。当我尝试发出 PUT 请求时,它会失败 stream was reset: REFUSED_STREAM
。
为了解决这个问题,我升级到两者的最新版本,在我写这篇文章的时候是:
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.okhttp3:okhttp:3.5.0'
如果您使用的是 retrofit 2.0.x 或 okhttp 3.1.x,升级应该可以解决问题。
如果还有人遇到问题(2018)。
我已通过将改装版本更新为
解决了该问题 implementation 'com.squareup.retrofit2:retrofit:2.4.0'