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 из службы.
С уважением