dpe*_*ers 2 android azure http2 azure-app-service-plans okhttp3
我们正在开发一个 Android 应用程序,它应该使用 Http/2 连接到我们的 Azure 应用服务。在 Azure 应用服务上,我们使用以下博客文章中的步骤启用了 Http/2:https : //blogs.msdn.microsoft.com/appserviceteam/2018/04/13/annoucing-http2-support-in-azure -应用服务/
我们的请求使用 Mutual SSL 进行保护,因此应用程序必须发送它的客户端证书。
当我们尝试使用 OkHttp 执行对我们的应用服务的调用时,我们总是收到以下错误和堆栈跟踪。当我们尝试使用相同的 Android 代码调用 twitter api 时,这是有效的。
有没有人知道如何解决这个问题?
我们使用的是 OkHttp 3.10.0 版。
堆栈跟踪:
06-08 15:54:00.173 31318-31351/be.wgkovl.evdt W/be.wgkovl.evdt.utils.BaseService:流被重置:HTTP_1_1_REQUIREDokhttp3.internal.http2.StreamResetException:流被重置:HTTP_1RED_1
在 okhttp3.internal.http2.Http2Stream.takeResponseHeaders(Http2Stream.java:153) ~[na:0.0]
在 okhttp3.internal.http2.Http2Codec.readResponseHeaders(Http2Codec.java:125) ~[na:0.0]
在 okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:88) ~[na:0.0]
在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) ~[na:0.0]
在 okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45) ~[na:0.0]
在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) ~[na:0.0]
在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121) ~[na:0.0]
在 okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93) ~[na:0.0]
在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) ~[na:0.0]
在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121) ~[na:0.0]
在 okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93) ~[na:0.0]
在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) ~[na:0.0]
在 okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126) ~[na:0.0]
在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) ~[na:0.0]
在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121) ~[na:0.0]
在 okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200) ~[na:0.0]
在 okhttp3.RealCall.execute(RealCall.java:77) ~[na:0.0]
在 be.wgkovl.evdt.utils.BaseService.executeRequest(BaseService.java:277) ~[na:0.0]
在 be.wgkovl.evdt.service.UserManagementService$1.doInBackground(UserManagementService.java:123) ~[na:0.0]
在 be.wgkovl.evdt.service.UserManagementService$1.doInBackground(UserManagementService.java:101) ~[na:0.0]
在 android.os.AsyncTask$2.call(AsyncTask.java:295) ~[na:0.0]
在 java.util.concurrent.FutureTask.run(FutureTask.java:237) ~[na:0.0]
在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) ~[na:0.0]
在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) ~[na:0.0]
在 java.lang.Thread.run(Thread.java:818) ~[na:0.0]
小智 6
在构建器中添加这一行
.protocols(Util.immutableList(Protocol.HTTP_1_1))
Run Code Online (Sandbox Code Playgroud)
像这样
private OkHttpClient client = new OkHttpClient.Builder()
.protocols(Util.immutableList(Protocol.HTTP_1_1))
.build();
Run Code Online (Sandbox Code Playgroud)
HTTP/2 目前并不真正支持客户端证书 - 特别是当此类连接仅适用于服务器上的某些资源时。有一个允许这样做的提案,但它尚未标准化,而且据我所知,尚未得到任何实施的支持。
在支持此功能之前,正确的响应是建议降级到 HTTP/1.1,并显示 HTTP_1_1_REQUIRED 错误代码,并且客户端应使用 HTTP/1.1 重试。
其他实现也可以像 Azure 一样执行此操作。
| 归档时间: |
|
| 查看次数: |
3671 次 |
| 最近记录: |