protobuf-net вызывает живую службу gRPC с отражением

Я разрабатываю службы gRPC с помощью protobuf-net из-за подхода сначала кода. Следующие контракты и участники у меня есть:

[ServiceContract(Name = "CountryServiceContract")]
    public interface ICountryServiceContract
    {

        [OperationContract]
        Task<IEnumerable<Country>> GetCountriesAsync(CancellationToken cancellationToken);
        [OperationContract]
        Task InsertCountryAsync(Country country, CancellationToken cancellationToken);

        [OperationContract]
        Task<Message<Country?>> GetCountryAsync(string isoCode, CancellationToken cancellationToken);

    }
[ProtoContract]
    public class Country
    {
        [ProtoMember(1)]
        [StringLength(255)]
        public string? Name { get; set; }
        [ProtoMember(2)]
        [StringLength(2)]
        public string? IsoCode { get; set; }

        [ProtoMember(3)]
        [StringLength(255)]
        public string? User { get; set; }
    }
[ProtoContract]
    public class Message<T>
    {
        public Message(T value)
        {
            Value = value;
        }

        public Message()
        {
            Value = default;
        }

        [AllowNull]
        [ProtoMember(1)]
        public T Value { get; set; }
    }

Цель состоит в том, чтобы я мог вызвать живой метод службы gRPC, чтобы проверить его. Поэтому я попытался сгенерировать файлы C# из живого сервиса и попытался сгенерировать файлы.proto. Обе попытки потерпели неудачу.

Я надеюсь, что если я смогу сгенерировать определения.proto по запросу, я смогу использовать его как клиент. Проблема заключалась в следующем сообщении об ошибке:Data of this type has inbuilt behaviour, and cannot be added to a model in this way: System.String

Следующий код, который я использовал для создания определения.proto:

SchemaGenerator schemaGenerator = new SchemaGenerator
            {
                ProtoSyntax = ProtoSyntax.Proto3,
                BinderConfiguration = BinderConfiguration.Create()
            };

            string protoDefnition = schemaGenerator.GetSchema(typeof(ICountryServiceContract));

Я заметил, что другие примитивные типы, такие как long выдает такое же сообщение об ошибке.

Второй подход заключался в использовании инструмента dotnet protogen. Я попытался сгенерировать файлы C# для такого тестаdotnet tool run protogen --grpc get https://localhost:5001 CountryServiceContract --csharp_out=myDir +langver=3 +names=original +oneof=default +listset=yes +services=yes

Результат меня удивил. Получил 3 файла. В ProtoBuf.Grpc.Internal.Empty определение, Country определение и CountryServiceContractопределение. Но в CountryServiceContract есть только одно определение метода для методаTask InsertCountryAsync(Country country, CancellationToken cancellationToken)Это могло быть причиной того, что у меня нет файла для Messageопределение. Я немного протестировал и заметил, что любые методы с подписью вроде Task<IEnumerable<Type>> MyMethod() или же Task<MyGenericType<MyType>> MyMethodTwo() не будет создаваться с помощью инструмента protogen.

Я что-то пропустил или сделал что-то не так? Я просто хочу протестировать живую службу gRPC, например, с помощью инструмента, который генерирует клиента из определений C# или определений.proto из службы.

С уважением

0 ответов

Другие вопросы по тегам