Dapr .Net SDK 问题与 InvokeMethodGrpcAsync() gRPC 调用

如何解决Dapr .Net SDK 问题与 InvokeMethodGrpcAsync() gRPC 调用

我在 Dapr 中启动了一个具有 gRPC 服务的应用程序。 使用 ID MyGrpcApi001 启动 Dapr。 HTTP 端口:55319。gRPC 端口:55320

我使用以下命令启动它:

dapr run --app-id MyGrpcApi001 --app-protocol grpc --app-port 5000 -- dotnet run

原型:

Syntax = "proto3";

import "google/protobuf/empty.proto";

option csharp_namespace = "MyGrpcService";

package greet;

// The greeting service deFinition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply);
  rpc Test (google.protobuf.Empty) returns (google.protobuf.Empty);
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings.
message HelloReply {
  string message = 1;
}

我有一个客户端,它有 2 个使用 gRPC 连接到服务的方法

    class Program
    {
        private static string LOCAL_ADDRESS = @"http://localhost:5000";
        private static string DAPR_ADDRESS = $"http://localhost:55320";

        static async Task Main(string[] args)
        {
            await CallToLocalHost().ConfigureAwait(false); // runs OK
            await CallWithClient().ConfigureAwait(false); // exception: Service is unimplemented
        }

        private static async Task CallToLocalHost()
        {
            using var channel = GrpcChannel.ForAddress(LOCAL_ADDRESS);
            var cl = new MyGrpcService.Greeter.GreeterClient(channel);
            MyGrpcService.HelloReply response = await cl.SayHelloAsync(new MyGrpcService.HelloRequest { Name = "ThinkPad" });
            Console.WriteLine(response.Message);
        }

        private static async Task CallWithClient()
        {
            using DaprClient client = new DaprClientBuilder()
                     .UseGrpcEndpoint(DAPR_ADDRESS)
                     .Build();

            var request = new MyGrpcService.HelloRequest { Name = "ThinkPad" };
            var result = await client.InvokeMethodGrpcAsync<MyGrpcService.HelloRequest,MyGrpcService.HelloReply>("MyGrpcApi001","SayHello",request).ConfigureAwait(false);
        }
    }

第二种方法好像不行,所以直接调用可以,但是sidecar好像没有找到服务。以下是两者的日志:

正在运行的服务的日志:

第一种方法OK:

== APP == info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
== APP ==       Request starting HTTP/2 POST http://localhost:5000/greet.Greeter/SayHello application/grpc -
== APP == info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
== APP ==       Executing endpoint 'gRPC - /greet.Greeter/SayHello'
== APP == info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
== APP ==       Executed endpoint 'gRPC - /greet.Greeter/SayHello'
== APP == info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
== APP ==       Request finished HTTP/2 POST http://localhost:5000/greet.Greeter/SayHello application/grpc - - 200 - application/grpc 0.3074ms

第二种方法错误

== APP == info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
== APP ==       Request starting HTTP/2 POST http://127.0.0.1:5000/dapr.proto.runtime.v1.AppCallback/OnInvoke application/grpc -
== APP == info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
== APP ==       Executing endpoint 'gRPC - Unimplemented service'
== APP == info: Grpc.AspNetCore.Server.Internal.ServerCallHandlerFactory[1]
== APP ==       Service 'dapr.proto.runtime.v1.AppCallback' is unimplemented.
== APP == info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
== APP ==       Executed endpoint 'gRPC - Unimplemented service'
== APP == info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
== APP ==       Request finished HTTP/2 POST http://127.0.0.1:5000/dapr.proto.runtime.v1.AppCallback/OnInvoke application/grpc - - 200 0 application/grpc 0.1474ms

第二个似乎包含错误的 URL,其中包含 /dapr.proto.runtime. ...

在这里做错了什么?是 dapr 运行命令错误,还是我的 InvokeMethodGrpcAsync 方法参数错误

由于我可以通过自动生成的客户端直接运行方法,我认为服务器工作正常,是dapr没有找到服务和/或方法

有什么想法吗?

谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?