我按照以下说明操作:
https://docs.microsoft.com/en-us/aspnet/core/tutorials/grpc/grpc-start?view=aspnetcore-3.1&tabs=visual-studio
在 .NET Core 中创建 gRPC 服务和客户端,一切都很好。
接下来,我需要一个旧的 .NET 框架应用程序访问该服务。我找到了一些安装的 NuGet 包,但没有找到任何告诉您如何使用它们来制作 gRPC 客户端的内容。我确定它在某个地方,但目前被 .NET Core 版本的文档淹没了。
我尝试创建一个 .NET Standard 项目来弥补差距,但 .Net Core 包需要 .Net Standard 2.1,它没有使用任何版本的 .Net Framework 来引用它。
谁能告诉我如何做到这一点或为我指明正确的方向?
编辑:
所以我找到了一些 .Net Framework 与 gRPC 一起工作的代码。 .Net Framework 示例默认为不安全连接,而 .Net Core 示例默认为安全连接。关于如何改变任何一个都没有明确的路径。我试过生成一个证书来让客户端连接,但这没有用。
所以我的新问题是:有谁知道如何说服 .Net Core gRPC 服务接受不安全的 (http:) 连接?
最佳答案
无论是否通过 SSL,您都需要在 ASP.NET Core 服务器中打开 Http2。所以在 appsettings.json 中,这样做。
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http2"
}
不安全的 .NET Framework 客户端 + ASP.NET Core 服务器 app.UseHttpsRedirection()
和 app.UseHsts()
在 StartUp
类(class)ConfigureServices(IApplicationBuilder app)
; var channel = new Channel("localhost", 5000, ChannelCredentials.Insecure);
安全 SSL 连接 .NET Framework 客户端 + ASP.NET Core 服务器 我通过在客户端中使用相同的服务器证书以 .pem 格式使用 SSL 端口。
SslCredentials secureCredentials = new SslCredentials(File.ReadAllText("certificate.pem"));
var channel = new Channel("localhost", 5001, secureCredentials);
一点解释。 VS 2019 中的 ASP.NETCore 模板使用带有 pfx 文件的开发证书 %AppData%\ASP.NET\Https\ProjectName.pfx
.证书的密码将在
%AppData%\Microsoft\UserSecrets\{UserSecretsId}\secrets.json
中提供。您可以获得
UserSecretsId
来自 ProjectName.csproj
的 ID .对于每个 ASP.NET Core 项目,这将有所不同。我们只需要证书的公钥作为
certificate.pem
文件以通过 gRPC 安全通信。使用以下命令从 pfx 中提取公钥openssl pkcs12 -in "<DiskLocationOfPfx>\ProjectName.pfx" -nokeys -out "<TargetLocation>\certifcate.pem"
复制此 cerificate.pem
供 gRPC .NET Framework 客户端使用。SslCredentials secureCredentials = new SslCredentials(File.ReadAllText("<DiskLocationTo the Folder>/certificate.pem"))
var channel = new Channel("localhost", 5001, secureCredentials);
请注意,我使用的端口 5001 是我的 ASP.NET Core 应用程序的 SSL 端口。用于生产场景
使用来自证书签名机构的有效证书,并在 ASP.NET Core 服务器和 .NET Framework 客户端中使用与
pfx
相同的证书和 pem
分别。使用自签名证书
对于大多数在我们自己的微服务之间进行通信的微服务,使用自签名证书是一个有效的选择。我们可能不需要权威机构签署的证书。我们在使用自签名证书时可能面临的一个问题是,该证书可能会颁发给某个目标 DNS 名称,而我们的 gRPC 服务器可能正在其他地方运行,无法建立安全连接。
使用 gRPC Target Name override keys覆盖 ssl 目标名称验证。
List<ChannelOption> channelOptions = new List<ChannelOption>()
{
new ChannelOption("grpc.ssl_target_name_override", <DNS to which our certificate is issued to>),
};
SslCredentials secureCredentials = new SslCredentials(File.ReadAllText("certificate.pem"));
var channel = new Channel("localhost", 5001, secureCredentials, channelOptions);
关于c# - 如何在 .NET Framework 中创建 gRPC 客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60766836/