标签: http2

为什么 Xamarin Android 无法发送 GRPC/Http2 请求?

我正在尝试运行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 的代码。

问题:

  1. 显然 Xamarin 支持 Grpc 和 Http。为什么会失败?鉴于我的怀疑是正确的,所以问题是因为 xamarin 使用旧版本的 System.Net.Http.dll 不支持 Http2。
  2. 如何确保 Xamarin 使用支持 Http2 的正确运行时程序集?
  3. 如果这对某人有用,您能分享一下系统配置吗?

配置

使用共享运行时: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

我尝试过的事情:

  1. 从 ModernHttpClient 切换到托管 HttpClient 实现 /NativeMessageHandler。仍然失败并出现同样的错误。(因为ALPN协商仍然使用相同的代码?) …

android xamarin http2 grpc

3
推荐指数
1
解决办法
3170
查看次数

HTTP/2.0 多路复用如何与 TCP 配合使用?

我不是专业的网络工程师,所以我希望我的问题不会显得含糊或na\xc3\xafve。

\n\n

HTTP/2.0 中的多路复用似乎利用单个 TCP 连接来同时处理多个/不同的请求,这样我们就可以避免队头阻塞问题。我想知道在数据重组的意义上它是如何与底层 TCP 连接一起工作/重叠的意义上它是如何与底层 TCP 连接一起工作/重叠的。

\n\n

TCP 还确保接收方接收到的数据 (D) 被重建,即使构成 D 的数据包乱序(或丢失)接收,以便在接收方重新构建 D,然后将其交给应用程序。

\n\n

我的问题是:HTTP/2.0 中的帧概念如何适应 TCP 数据包重组以在接收端组成完整的消息?哪一个先发生?或者,帧和数据包之间存在什么样的映射(一对一、一对多等)?简而言之,他们如何协同工作?

\n

tcp frames packet multiplexing http2

3
推荐指数
1
解决办法
1581
查看次数

如何使用 JavaFX 14/HTTP2/JDK-8211308 让 JavaFX WebView 继续加载具有自签名证书的页面

谁能告诉我更新到 JavaFX 14 后如何在 WebView 中继续使用自签名 https 证书显示网页?

\n

在 JavaFX 14 之前,我们一直通过使用and实现自定义TrustHandlerand\xc2\xa0来处理此问题。HostnameVerifierHttpsURLConnection.setDefaultSSLSocketFactoryHttpsURLConnection.setDefaultHostnameVerifier

\n

当我切换到 JavaFX 14 且 WebView 尝试加载自签名网页时

\n
    \n
  • 他们不加载,
  • \n
  • 不再调用自定义 TrustHandler 代码,并且
  • \n
  • 我从\xc2\xa0 得到这个webView.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)

ssl javafx self-signed webview http2

3
推荐指数
1
解决办法
1326
查看次数

如何使用 Jetty 客户端根据请求获取 bytesIn/bytesOut

我正在使用 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 请求字节,包括标头大小...)

java http jetty jetty-9 http2

3
推荐指数
1
解决办法
224
查看次数

与后端服务器重用 http 连接 - Web fetch API

我在我的网站上托管example.com我的 graphQL 后端,graphql.example.com该后端通过 CORS 提供 JSON。据我了解,每个请求都window.fetch('https://graphql.example.com/', ...)需要创建一个新连接。我知道浏览器能够为example.com通过 http2 建立的多个资产重用相同的连接。例如,如果我的网页有 s <img>example.com/a.jpgexample.com/b.jpg只需支付一次设置连接的费用。

无论如何,是否可以以类似的方式重用连接

  • (a) 与window.fetch()
  • (b) 到另一个需要 CORS 的域

javascript browser http fetch http2

3
推荐指数
1
解决办法
875
查看次数

http2 的适当 MAX_CONCURRENT_STREAMS 值

我遇到一种情况,需要max_concurrent_streams在使用 grpc-go 时设置选项。所以我读了这个RFC7540文档

我阅读了这篇文章并进行了搜索,但我有一个问题尚未得到解答。

  1. 我正在尝试将 MAX_CONCURRENT_STREAMS 设置为 uint64 max。这样会不会有什么问题呢?
  2. 如果CONCURRENT_STREAM增加时出现问题,那是什么问题呢?
  3. 如果没有问题,为什么默认值是100呢?

http2 grpc grpc-go

3
推荐指数
1
解决办法
8919
查看次数

HTTP/2协议中WINDOW_UPDATE和SETTINGS帧之间有什么区别?

我已经阅读了一些HTTP/2 rfc7540规范,我还不完全了解HTTP/2协议中WINDOW_UPDATE和SETTINGS帧之间的区别是什么?

http http2 nghttp2

2
推荐指数
1
解决办法
507
查看次数

PHP:获取HTTP协议版本(HTTP/1.1与HTTP/2)

到目前为止,我的php应用程序在任 所以我定义了所有标题:

header("HTTP/1.1 500 Internal Server Error"); 
Run Code Online (Sandbox Code Playgroud)

但现在我的服务器也支持HTTP 2,我想用正确的HTTP状态代码更新所有标头响应.

如何获取http请求的HTTP协议版本?

(我的网络服务器是nginx,但我想如果我使用的是nginx或apache则无关紧要.)

php http http-1.1 http2

2
推荐指数
1
解决办法
4779
查看次数

什么是HTTP/2的协议ID,为什么有这么多?

我正在学习HTTP/2.我知道RFC7540是HTTP/2的规范.但我对实现页面上显示的术语"协议ID"感到困惑.有h2,h2c,h2-14,h2-15,h2-16,h2-17,h2c-17(不知道我列出的所有).

这些协议ID是什么?他们和RFC7540之间有什么关系?

如果某些HTTP/2服务器实现声称支持(?)某些协议ID,这意味着什么?

terminology http http2

2
推荐指数
1
解决办法
210
查看次数

iOS10 NSURLSession HTTP/2无效

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)

http2 ios10 charles-proxy

2
推荐指数
1
解决办法
893
查看次数