2017-02-01 2 views
0

Я пытаюсь изучить gRPC, создав простой сервер/клиент проекта, который клиент отправляет 2 Int Variable, и сервер будет обрабатываться строкой и переменной 2, которую клиент отправил. Код буфера протокола является:gRPC - Unary Call C#

syntax = "proto3"; 
option csharp_namespace = "MapPB"; 

service MapRoute { 

    rpc Gps(Location) returns (LocationName) {} 
} 


message Location { 

    int32 la = 1; 
    int32 lo = 2; 
} 

message LocationName { 

    string Name = 1; 
} 

Сервер

using Grpc.Core; 
using static MapPB.MapRoute; 
using MapPB; 

namespace gServer 
{ 
    public class gS : MapRouteBase 
    { 
     public override async Task<LocationName> Gps(Location request, ServerCallContext context) 
     { 

      return await base.Gps(new LocationName { Name = "Your Location is " + request.La + ":" + request.Lo }); 

     } 

    } 
    class Program 
    { 
     const int Port = 50051; 
     static void Main(string[] args) 
     { 

      Server server = new Server 
      { 
       Services = { MapRoute.BindService(new gS()) }, 
       Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) } 
      }; 
      server.Start(); 

      Console.WriteLine("Map server listening on port " + Port); 
      Console.WriteLine("Press any key to stop the server..."); 
      Console.ReadKey(); 

      server.ShutdownAsync().Wait(); 

     } 
    } 
} 

Client

using Grpc.Core; 
using Map; 
using static MapPB.MapRoute; 


namespace Map 
{ 
    class Program : MapRouteClient 
    { 

     static void Main(string[] args) 
     { 
      Channel channel = new Channel("127.0.0.1:50021", ChannelCredentials.Insecure); 

      var client = new MapRouteClient(channel); 

      int la = 1; 
      int lo = 2; 

      var reply = client.Gps(new MapPB.Location { La = la , Lo = lo }); 

      Console.WriteLine(reply.Name); 


      channel.ShutdownAsync().Wait(); 
      Console.WriteLine("Press any key to exit..."); 
      Console.ReadKey(); 

     } 
    } 
} 

Am получая красный загогулина в коде сервера под .Gps

Там не аргумент, учитывая, что соответствует требуемому формальному параметру «контекста» «MapRoute.MapRouteBase.Gps (Location, ServerCallContext)»

Я пытался добавить context к параметру, но я получил другую ошибку

не может конвертировать из «MapPB.LocationName» до «» MapPB.Location

Может кто-нибудь объяснить, что не так, пожалуйста?

+0

Попробуйте 'return new LocationName {Name =" Ваше местоположение "+ request.La +": "+ request.Lo};' Я предполагаю, что базовый класс является абстрактным, и вы не должны делегировать ему. – Matthias247

+0

Yup, который сработал, спасибо – Skoochapp

+0

Хорошо - я преобразовал его в ответ – Matthias247

ответ

0

Ваша реализация функции обслуживания должна выглядеть следующим образом:

public override async Task<LocationName> Gps(Location request, ServerCallContext context) 
{ 
    return new LocationName { Name = "Your Location is " + request.La + ":" + request.Lo }; 
} 

Идея заключается в том, что функция автоматически вызывается всякий раз, когда клиент вызывает его. Он передает вам определенные параметры (местоположение здесь). Ожидается, что вы вернете результат - это имя места здесь.

Что вы сделали неправильно, было делегирование обработки базовому классу вместо обработки запроса самостоятельно.

Смежные вопросы