Исключение при добавлении нового метода в рабочий Сервис с использованием gRPC-Web и protobuf-net
Я получаю следующее исключение:
Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] Компонент визуализации необработанного исключения: инициализатор типа для DefaultProxyCache
1' threw an exception. System.TypeInitializationException: The type initializer for 'DefaultProxyCache
1 'выбросил исключение. ---> System.ArgumentException: недопустимые универсальные аргументы Имя параметра: typeArguments в (оболочка, управляемая встроенной) System.Reflection.RuntimeMethodInfo.MakeGenericMethod_impl(System.Reflection.RuntimeMethodInfo,System.Type[]) в System.Reflection..MakeGenericMethod (System.Type[] methodInstantiation) <0x342def8 + 0x000d6> в:0 в ProtoBuf.Grpc.Internal.ContractOperation.TryGetClientHelper () [0x0001b] в //sractc/protobufc-net.Internal/: Contternal. 291 в ProtoBuf.Grpc.Internal.ProxyEmitter.EmitFactory[TService] (ProtoBuf.Grpc.Configuration.BinderConfiguration binderConfig) [0x00477] в //src/protobuf-net.Grpc/Internal/ProxyEmitter.cs:238 в ProtoBuf.Grpc.Internal.ProxyEmitter.CreateFactory[TService] (ProtoBuf.Grpc.Configuration.BinderConfiguration binderConfig) [0x0006d] в // sr-net.Grpc/Internal/ProxyEmitter.cs:123 в ProtoBuf.Grpc.Configuration.ClientFactory+DefaultProxyCache`1[TService]..cctor () [0x00000] в //src/protobuf-net.Grpc/Configuration/ClientFactory.cs: 81 год
В моем проекте используются gRPC-Web, веб-сборка Blazor и protobuf-net.
Это мой сервисный контракт:
[ServiceContract(Name = "Services.Customer")]
public interface ICustomerService
{
ValueTask<Customer> CreateCustomer(Customer customerDTO);
ValueTask<CustomerResultSet> GetCustomers();
}
Реализация:
public class CustomerService : ICustomerService
{
private readonly CustomerUseCases customerLogic;
public CustomerService(CustomerUseCases customerLogic)
{
this.customerLogic = customerLogic;
}
public async ValueTask<Customer> CreateCustomer(Customer customerDTO)
{
var result = await customerLogic.CreateCustomer(customerDTO);
return customerDTO;
}
public async ValueTask<CustomerResultSet> GetCustomers()
{
CustomerResultSet result = new CustomerResultSet { Customers = await customerLogic.GetCustomer() };
return result;
}
}
Что касается Datacontracts:
[DataContract]
public class CustomerResultSet
{
[DataMember(Order = 1)]
public IEnumerable<Customer> Customers { get; set; }
}
А также,
[DataContract]
public partial class Customer
{
[DataMember(Order = 1)]
public int CustomerId { get; set; }
[DataMember(Order = 2)]
public string CustomerName { get; set; }
}
Раньше я возвращал список клиентов в службе, но я понимаю, что мне нужен класс для моделирования сообщения, чтобы protobuf-net мог сериализоваться, поэтому CustomerResultSet. Тем не менее, это не работает. Любая помощь очень ценится
2 ответа
Это... странно. Я не могу воспроизвести его здесь, поэтому предполагаю, что это что-то специфическое для Blazor. Я проверил, что делает код в "обычных" фреймворках, и, по крайней мере, мне кажется, что он делает правильные вещи - используяUnaryValueTaskAsync<Customer, Customer>()
а также UnaryValueTaskAsync<Empty, CustomerResultSet>()
, чего я и ожидал. Я улучшил обработку исключений в этом пути кода, чтобы хотя бы дать нам представление о том, что он пытается сделать, поэтому мое предложение:
- обновить до
protobuf-net.Grpc
версия>= 1.0.119 (я разверну его, как только завершит CI) - повторные попытки, и дайте мне знать точно, что он говорит прямо сейчас
В качестве альтернативы, если у вас есть минимальное воспроизведение, включая биты blazor, скажем, в репозитории GitHub, я с радостью могу взглянуть на него.
(совет: я стараюсь следить как за stackru, так и за GitHub, но GitHub, вероятно, более подходит для такого рода вопросов - я с радостью скажу, что это ошибка, поэтому: https://github.com/protobuf-net/protobuf-net.Grpc/issues)
У меня была аналогичная проблема.
System.InvalidOperationException: ошибка при получении клиентского помощника UnaryValueTaskAsync (из: System.Guid в: Test.DTO.OpResult): недопустимые общие аргументы
Весь мой ServiceContract в этой службе перестал работать. Это произошло после того, как я добавил
ValueTask ChangeCompany(Guid companyGuid);
я изменил его на
ValueTask ChangeCompany(string companyGuid);
И это заставило его снова работать. Ошибка была немного запутанной, так как я не использовал ChangeCompany, но, как уже было сказано, не работали вызовы.