当前位置: 首页 > 知识库问答 >
问题:

HTTP2 .Net Framework 与 gRPC 的问题

文喜
2023-03-14

我需要将gRPC用于双向流,其中客户端是.Net Framework项目,由于遗留问题,无法升级到.NET5。

当阅读microsoft留档,我可以看到应该使用WinHttpHandler(https://docs.microsoft.com/en-us/aspnet/core/grpc/netstandard?view=aspnetcore-5.0)。

但是我似乎在使用SSL进行此设置时遇到了问题,有人有什么建议可以解决这个问题吗?

我得到以下错误:

"无效操作异常:GrpcChannel不支持带有非空参数的SslCreentials。GrpcChannel使用HttpClient进行gRPC调用,HttpClient自动从操作系统证书存储中加载根证书。客户端证书应在HttpClient上配置。有关详细信息,请参阅https://aka.ms/aspnet/grpc/certauth。"

我的服务器使用以下设置进行设置:

let cacert = File.ReadAllText(@"ca.crt");
let servercert = File.ReadAllText(@"server.crt");
let serverkey = File.ReadAllText(@"server.key");

let certificatePair = new KeyCertificatePair(servercert, serverkey);
let certList = new System.Collections.Generic.List<KeyCertificatePair>()
    certList.Add(certificatePair)
let server = new Server()
    server.Services.Add(EventSubscriberService.EventSubscriberServiceMethodBinder.BindService(new EventSubscriber()))
    server.Ports.Add(new ServerPort("localhost", 5001,SslServerCredentials(certList,cacert,false))) 
    |> ignore'''

客户端使用这种设置:

let cacert = File.ReadAllText(@"ca.crt");
let clientcert = File.ReadAllText(@"client.crt");
let clientkey = File.ReadAllText(@"client.key");
let ssl = new SslCredentials(cacert, new KeyCertificatePair(clientcert, clientkey))

let channelOptions = GrpcChannelOptions()
channelOptions.HttpHandler <- new WinHttpHandler()    
channelOptions.Credentials <- ssl


let channel = GrpcChannel.ForAddress("http://127.0.0.1:5001",channelOptions)

它是用F#编写的,但类似于这个C#代码,如果引用有助于易读性的话。如何为gRPC启用服务器端SSL?

共有1个答案

牛景同
2023-03-14

可能以下内容(粗略草案)可以起作用:

open System.Net.Http
open Grpc.Net.Client
open System.Security.Cryptography.X509Certificates

let clientCert = new X509Certificate() // create according to your needs
let handler = new HttpClientHandler()
handler.ClientCertificates.Add(clientCert) |> ignore
// insecure, check your custom server cert
handler.ServerCertificateCustomValidationCallback <- fun msg cert chain e -> true
let client = new HttpClient(handler)
let channelOptions = GrpcChannelOptions(HttpClient = client)
let channel = GrpcChannel.ForAddress("http://127.0.0.1:5001", channelOptions)
 类似资料:
  • 本文档作为 gRPC 在 HTTP2 草案17框架上的实现的详细描述,假设你已经熟悉 HTTP2 的规范。产品规则采用的是ABNF 语法 大纲 以下是 gRPC 请求和应答消息流中一般的消息顺序: 请求 → 请求报头 *有定界符的消息 EOS 应答 → 应答报头 *有定界符的消息 EOS 应答 → (应答报头 *有定界符的消息 跟踪信息) / 仅仅跟踪时 请求 请求 → 请求报头 *界定的消息 E

  • 之前,我使用了.NETCore2.x的grpc,现在称为C-CoreGRPC,以区别于新的.NETCore3版本。我喜欢新的grpc能够从VS2019中的proto文件编译和生成客户端/服务器存根类的方式,而不是pf必须从packages文件夹中获取grpc工具,手动为C#编译它以生成客户端/服务端存根类,然后导入VS。新版本的grpc更干净。然而,在将C核grpc与asp。net核心web AP

  • ProtoBuf 与 gRPC ProtoBuf 是一套接口描述语言(IDL)和相关工具集(主要是 protoc,基于 C++ 实现),类似 Apache 的 Thrift)。用户写好 .proto 描述文件,之后使用 protoc 可以很容易编译成众多计算机语言(C++、Java、Python、C#、Golang 等)的接口代码。这些代码可以支持 gRPC,也可以不支持。 gRPC 是 Goog

  • 问题内容: 我有一个在nginx代理后面运行的node.js服务器。node.js在端口3000上运行HTTP 1.1(无SSL)服务器。两者均在同一服务器上运行。 我最近将nginx设置为将HTTP2与SSL(h2)结合使用。似乎HTTP2确实已启用并且正在工作。 但是,我想知道代理连接(nginx <-> node.js)正在使用HTTP 1.1的事实是否会影响性能。也就是说,因为我的内部连接

  • 我试图查询一些在HTTP上运行的本地gRPC服务。这是我的网核3.1控制台应用程序: 但它抛出了这个错误: 类型'Grpc.Core.RpcException'的异常发生在System.Private.CoreLib中.dll但在用户代码中未处理:'Status(StatusCode=“Internal”, Detail=“启动gRPC调用时出错。HttpRequestException:发送请求

  • imi v1.0.20 新增支持开发 Http2 服务。 具体开发方法和 Http、WebSocket 类似。 需要除了需要加配置外,请求响应对象是使用 Http 的对象。 并且可以像开发 WebSocket 一样使用请求上下文存储数据,因为 Http2 是以全双工长连接的方式工作的。 配置方法 在项目 config.php 中的服务器配置中加入: 'configs' => [ 'o