Asp.net core 在.net内核中通过http发出Grpc请求时,会创建以下异常。我正在使用.NETCore3.1

Asp.net core 在.net内核中通过http发出Grpc请求时,会创建以下异常。我正在使用.NETCore3.1,asp.net-core,grpc,Asp.net Core,Grpc,在我的program.cs文件中,我使用的UseURL设置为“http://localhost/5009“在appsettings.json中,kestrel部分如下所示 public UserDetails GetToken(UserDetails aUserDetails) { try { AppContext.SetSwitch( "

在我的program.cs文件中,我使用的UseURL设置为“http://localhost/5009“在appsettings.json中,kestrel部分如下所示

      public UserDetails GetToken(UserDetails aUserDetails)
        {
            try
            {
                AppContext.SetSwitch(
                    "System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);

                using GrpcChannel channel1 = Grpc.Net.Client.GrpcChannel.ForAddress("http://localhost:5009/");
                var client1 = new Greeter.GreeterClient(channel1);
                UserDetails lUserDetails = client1.GetToken(aUserDetails);
                return lUserDetails;
            }catch(Exception ex) 
            {
                throw ex;
            }
         
        }```
port no in Grpc Service and client is same.

我删除了appsettings.json中的kestrel部分,一切正常

我可以用这种方式解决它:

"Kestrel": {
    "Endpoints": {
      "HttpsInlineCertFile": {
        "Url": "https://localhost:5010",`enter code here`
        "Protocols": "Http2"
      }
      //,
      //"EndpointDefaults": {
      //  "Url": "http://localhost:5001",
      //  "Protocols": "Http2"
      //}
    }
  }
公共静态IWebHostBuilder CreateWebHostBuilder(字符串[]args)=>
WebHost.CreateDefaultBuilder(args)
.UseConfiguration(配置)
.ConfigureKestrel(选项=>
{
var(httpPort,grpcPort)=GetDefinedPorts();
选项.Listen(IPAddress.Any、httpPort、listenOptions=>
{
listenOptions.Protocols=HttpProtocols.http1和http2;
UseHttps();
});
选项.Listen(IPAddress.Any、grpcPort、listenOptions=>
{
listenOptions.Protocols=HttpProtocols.Http2;
});
})
.UseStartup();
私有静态(int-httpPort,int-grpcPort)GetDefinedPorts()
{
var grpcPort=Configuration.GetValue(“GRPC_-PORT”,5000);
var port=Configuration.GetValue(“端口”,5001);
返回(端口,grpcPort);
}
基本上我配置了两个端口:

  • 5001上支持HTTP 1和2的HTPPS端口,然后我可以打开“localhost:50001/swagger”
  • 以及另一个使用HTTP且仅支持HTTP2用于gRPC连接的端口

这里也有同样的问题。明白了吗?
"Kestrel": {
    "Endpoints": {
      "HttpsInlineCertFile": {
        "Url": "https://localhost:5010",`enter code here`
        "Protocols": "Http2"
      }
      //,
      //"EndpointDefaults": {
      //  "Url": "http://localhost:5001",
      //  "Protocols": "Http2"
      //}
    }
  }
 public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseConfiguration(Configuration)
            .ConfigureKestrel(options =>
            {
                var (httpPort, grpcPort) = GetDefinedPorts();

                options.Listen(IPAddress.Any, httpPort, listenOptions =>
                {
                    listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
                    listenOptions.UseHttps();
                });

                options.Listen(IPAddress.Any, grpcPort, listenOptions =>
                {
                    listenOptions.Protocols = HttpProtocols.Http2;
                });
            })
            .UseStartup<Startup>();

    private static (int httpPort, int grpcPort) GetDefinedPorts()
    {
        var grpcPort = Configuration.GetValue("GRPC_PORT", 5000);
        var port = Configuration.GetValue("PORT", 5001);

        return (port, grpcPort);
    }