我正在尝试运行Dot net conf 2019 keynote中的 xamarin 表单示例。我已经托管了 grpc 服务,.net core 控制台应用程序可以毫无问题地从中获取数据。但是,当运行 xamarin 应用程序时,ALPN 协商(客户端问候)发生在 http 1.1 上,因此 grpc 调用失败。 源代码可在此处获取
错误消息:Grpc.Core.RpcException:状态(StatusCode=Internal,Detail=“gRPC 响应错误。响应协议降级为 HTTP/1.1。”
调试器显示 xamarin 上使用的 SocketsHttpHandler 没有支持 Http 2 的代码。
问题:
配置
使用共享运行时:true
Mono 共享运行时版本(如在 Android 设备上看到的):10.1.0-18。
Windows 10 上的 Visual studio 2019:
Xamarin.Android SDK 10.1.4.0 (d16-4/e44d1ae)
Xamarin.Android 参考程序集和 MSBuild 支持。
单声道:fd9f379
Java.Interop:xamarin/java.interop/d16-4@c4e569f
Xamarin.Android工具:xamarin/xamarin-android-tools/d16-5@9f4ed4b
我尝试过的事情:
我不是专业的网络工程师,所以我希望我的问题不会显得含糊或na\xc3\xafve。
\n\nHTTP/2.0 中的多路复用似乎利用单个 TCP 连接来同时处理多个/不同的请求,这样我们就可以避免队头阻塞问题。我想知道在数据重组的意义上它是如何与底层 TCP 连接一起工作/重叠的意义上它是如何与底层 TCP 连接一起工作/重叠的。
\n\nTCP 还确保接收方接收到的数据 (D) 被重建,即使构成 D 的数据包乱序(或丢失)接收,以便在接收方重新构建 D,然后将其交给应用程序。
\n\n我的问题是:HTTP/2.0 中的帧概念如何适应 TCP 数据包重组以在接收端组成完整的消息?哪一个先发生?或者,帧和数据包之间存在什么样的映射(一对一、一对多等)?简而言之,他们如何协同工作?
\n谁能告诉我更新到 JavaFX 14 后如何在 WebView 中继续使用自签名 https 证书显示网页?
\n在 JavaFX 14 之前,我们一直通过使用and实现自定义TrustHandlerand\xc2\xa0来处理此问题。HostnameVerifierHttpsURLConnection.setDefaultSSLSocketFactoryHttpsURLConnection.setDefaultHostnameVerifier
当我切换到 JavaFX 14 且 WebView 尝试加载自签名网页时
\nwebView.getEngine().getLoadWorker().getException():\n java.lang.Throwable: SSL handshake failed \n \xc2\xa0at javafx.web/javafx.scene.web.WebEngine$LoadWorker.describeError(WebEngine.java:1431) \n \xc2\xa0at javafx.web/javafx.scene.web.WebEngine$LoadWorker.dispatchLoadEvent(WebEngine.java:1370) \n \xc2\xa0at javafx.web/javafx.scene.web.WebEngine$PageLoadListener.dispatchLoadEvent(WebEngine.java:1231) \n \xc2\xa0at javafx.web/com.sun.webkit.WebPage.fireLoadEvent(WebPage.java:2514) \n \xc2\xa0at javafx.web/com.sun.webkit.WebPage.fwkFireLoadEvent(WebPage.java:2359) \n \xc2\xa0at javafx.web/com.sun.webkit.network.URLLoaderBase.twkDidFail(Native Method) \n \xc2\xa0at javafx.web/com.sun.webkit.network.HTTP2Loader.notifyDidFail(HTTP2Loader.java:624) \n \xc2\xa0at javafx.web/com.sun.webkit.network.HTTP2Loader.lambda$didFail$18(HTTP2Loader.java:606) \n \xc2\xa0at javafx.web/com.sun.webkit.network.HTTP2Loader.lambda$callBackIfNotCanceled$10(HTTP2Loader.java:437) \n \xc2\xa0at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428) \n \xc2\xa0at java.base/java.security.AccessController.doPrivileged(AccessController.java:391) \n \xc2\xa0at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427) \n \xc2\xa0at …Run Code Online (Sandbox Code Playgroud)我正在使用 Jetty Client 11,并且想计算每个请求发送/接收的字节。
我正在使用高级 HttpClient 。我已阅读此文档,但没有看到任何有关如何执行此操作的信息:
我发现有一种方法可以通过执行以下操作来获取此信息:
ConnectionStatistics connectionStatistics = new ConnectionStatistics();
httpClient.addBean(connectionStatistics);
Run Code Online (Sandbox Code Playgroud)
然后:
Request request = httpClient.newRequest(uri)
.version(HttpVersion.HTTP_2)
.timeout(CONNECTION_TIMEOUT_SECONDS, TimeUnit.SECONDS);
request.send(listener);
ConnectionStatistics connectionStatistics = httpClient.getBean(ConnectionStatistics.class);
System.out.println(connectionStatistics.getSentBytes()+"/"+ connectionStatistics.getReceivedBytes());
Run Code Online (Sandbox Code Playgroud)
我肯定做错了什么,因为它甚至在全球范围内都不起作用,它总是给出 0。
无论如何,我不知道如何让它根据请求工作。
编辑:
我尝试过@sbordet 回答:
httpClient.newRequest(...)
.onRequestContent((req, buf) -> requestBytes.add(buf.remaining()))
...
.onResponseContent((res, buf) -> responseBytes.add(buf.remaining()))
...
send(...);
Run Code Online (Sandbox Code Playgroud)
它对于响应效果很好。 但是对于请求,我想测量发送的字节数,它总是给出 0 (注意我只有没有内容的获取),而我希望有原始大小(原始 HTTP 请求字节,包括标头大小...)
我在我的网站上托管example.com我的 graphQL 后端,graphql.example.com该后端通过 CORS 提供 JSON。据我了解,每个请求都window.fetch('https://graphql.example.com/', ...)需要创建一个新连接。我知道浏览器能够为example.com通过 http2 建立的多个资产重用相同的连接。例如,如果我的网页有 s <img>,example.com/a.jpg我example.com/b.jpg只需支付一次设置连接的费用。
无论如何,是否可以以类似的方式重用连接
window.fetch()我遇到一种情况,需要max_concurrent_streams在使用 grpc-go 时设置选项。所以我读了这个RFC7540文档。
我阅读了这篇文章并进行了搜索,但我有一个问题尚未得到解答。
我已经阅读了一些HTTP/2 rfc7540规范,我还不完全了解HTTP/2协议中WINDOW_UPDATE和SETTINGS帧之间的区别是什么?
到目前为止,我的php应用程序在任 所以我定义了所有标题:
header("HTTP/1.1 500 Internal Server Error");
Run Code Online (Sandbox Code Playgroud)
但现在我的服务器也支持HTTP 2,我想用正确的HTTP状态代码更新所有标头响应.
如何获取http请求的HTTP协议版本?
(我的网络服务器是nginx,但我想如果我使用的是nginx或apache则无关紧要.)
NSURLSession请求HTTP/2.0
在iOS9中工作.
但在iOS10中无效
我的代码:
NSURLSession *session = [NSURLSession sharedSession];
request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://ga.seeyouyima.com/page"]];
[request setHTTPMethod:@"POST"];
[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (completedBlock) {
completedBlock(data, response, error);
}
}] resume];
Run Code Online (Sandbox Code Playgroud)