Исключение при добавлении нового метода в рабочий Сервис с использованием gRPC-Web и protobuf-net

Я получаю следующее исключение:

Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] Компонент визуализации необработанного исключения: инициализатор типа для DefaultProxyCache1' threw an exception. System.TypeInitializationException: The type initializer for 'DefaultProxyCache1 'выбросил исключение. ---> 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, но, как уже было сказано, не работали вызовы.

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