Grpc.Core.RpcException method is unimplemented with C# client and Java Server

4,459 views
Skip to first unread message

and...@gmail.com

unread,
May 21, 2017, 5:45:29 PM5/21/17
to grpc.io

I am having trouble finding the source of this error. I implemented a simple service using protobuf:

syntax = "proto3";

package tourism;

service RemoteService {
  rpc Login(LoginUserDTO) returns (Response) {}
}

message AgencyDTO{
  int32 id=1;
  string name=2;
  string email=3;
  string password=4;
}

message LoginUserDTO{
  string password=1;
  string email=2;
}

message SearchAttractionsDTO{
  string name=1;
  int32 start_hour=2;
  int32 start_minute=3;
  int32 stop_hour=4;
  int32 stop_minute=5;
  AgencyDTO loggedUser=6;
}

message AttractionDTO{
  int32 id=1;
  string name=2;
  string agency=3;
  int32 hour=4;
  int32 minute=5;
  int32 seats=6;
  int32 price=7;
}

message ReservationDTO{
  int32 id=1;
  string first_name=2;
  string last_name=3;
  string phone=4;
  int32 seats=5;
  AttractionDTO attraction=6;
  AgencyDTO agency=7;
}

message Response{
  enum ResponseType{
    OK=0;
    NOT_LOGGED_ID=1;
    SERVER_ERROR=2;
    VALIDATOR_ERROR=3;
  }
  ResponseType type=1;
  AgencyDTO user=2;
  string message=3;
}

When using a java client everything works fine, the server receives the request and responds appropriately. When using C# with the same .proto file for generating sources:

namespace testGrpc2
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            var channel = new Channel("127.0.0.1:61666",ChannelCredentials.Insecure);
            var client = new RemoteService.RemoteServiceClient(channel);
            Response response=client.Login(new LoginUserDTO{Email="e...@ex.com",Password="notmypassword"});
            Console.WriteLine(response);
            Console.ReadKey();
        }
    }
} 

at the client.Login() I get the following errror: Grpc.Core.RpcException Status(StatusCode=Unimplemented, Detail="Method tourism.RemoteService/Login is unimplemented"). The server receives the request but does not have time to respond and throws:

INFO: Request from ex@ex.com
May 22, 2017 12:28:58 AM io.grpc.internal.SerializingExecutor run
SEVERE: Exception while executing runnable io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$2@4be43082
java.lang.IllegalStateException: call is closed
    at com.google.common.base.Preconditions.checkState(Preconditions.java:174)
    at io.grpc.internal.ServerCallImpl.sendHeaders(ServerCallImpl.java:103)
    at io.grpc.stub.ServerCalls$ServerCallStreamObserverImpl.onNext(ServerCalls.java:282)
    at ServiceImp.login(ServiceImp.java:20)
    at tourism.RemoteServiceGrpc$MethodHandlers.invoke(RemoteServiceGrpc.java:187)
    at io.grpc.stub.ServerCalls$1$1.onHalfClose(ServerCalls.java:148)
    at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.halfClosed(ServerCallImpl.java:262)
    at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$2.runInContext(ServerImpl.java:572)
    at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:52)
    at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:117)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Eric Anderson

unread,
May 22, 2017, 4:42:01 PM5/22/17
to and...@gmail.com, grpc.io
On Sun, May 21, 2017 at 2:45 PM, <and...@gmail.com> wrote:

Grpc.Core.RpcException Status(StatusCode=Unimplemented, Detail="Method tourism.RemoteService/Login is unimplemented"). The server receives the request but does not have time to respond and throws:

INFO: Request from ex@ex.com
May 22, 2017 12:28:58 AM io.grpc.internal.SerializingExecutor run
SEVERE: Exception while executing runnable io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$2@4be43082
java.lang.IllegalStateException: call is closed
    at com.google.common.base.Preconditions.checkState(Preconditions.java:174)
    at io.grpc.internal.ServerCallImpl.sendHeaders(ServerCallImpl.java:103)
    at io.grpc.stub.ServerCalls$ServerCallStreamObserverImpl.onNext(ServerCalls.java:282)
    at ServiceImp.login(ServiceImp.java:20)
    at tourism.RemoteServiceGrpc$MethodHandlers.invoke(RemoteServiceGrpc.java:187)
    at io.grpc.stub.ServerCalls$1$1.onHalfClose(ServerCalls.java:148)
    at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.halfClosed(ServerCallImpl.java:262)
    at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$2.runInContext(ServerImpl.java:572)
    at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:52)
    at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:117)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

I'm surprised to see Unimplemented while your service implementation (I assume ServiceImp) is running. Are you calling onNext after calling onError? If you could show/describe your calls to the StreamObserver in login that may help in figuring out what is wrong.

Eric Anderson

unread,
May 22, 2017, 4:43:32 PM5/22/17
to and...@gmail.com, grpc.io
nm. I see you figured out the solution on StackOverflow. Yes, service implementations don't call super, since the default responds with UNIMPLEMENTED.
Reply all
Reply to author
Forward
0 new messages