使用 gRPC-Web 和 protobuf-net 在工作服务中添加新方法时出现异常

Exception when adding new method in a working Service using gRPC-Web and protobuf-net

我遇到以下异常:

Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] Unhandled exception rendering component: The type initializer for 'DefaultProxyCache1' threw an exception. System.TypeInitializationException: The type initializer for 'DefaultProxyCache1' threw an exception. ---> System.ArgumentException: Invalid generic arguments Parameter name: typeArguments at (wrapper managed-to-native) System.Reflection.RuntimeMethodInfo.MakeGenericMethod_impl(System.Reflection.RuntimeMethodInfo,System.Type[]) at System.Reflection.RuntimeMethodInfo.MakeGenericMethod (System.Type[] methodInstantiation) <0x342def8 + 0x000d6> in :0 at ProtoBuf.Grpc.Internal.ContractOperation.TryGetClientHelper () [0x0001b] in //src/protobuf-net.Grpc/Internal/ContractOperation.cs:291 at ProtoBuf.Grpc.Internal.ProxyEmitter.EmitFactory[TService] (ProtoBuf.Grpc.Configuration.BinderConfiguration binderConfig) [0x00477] in //src/protobuf-net.Grpc/Internal/ProxyEmitter.cs:238 at ProtoBuf.Grpc.Internal.ProxyEmitter.CreateFactory[TService] (ProtoBuf.Grpc.Configuration.BinderConfiguration binderConfig) [0x0006d] in //src/protobuf-net.Grpc/Internal/ProxyEmitter.cs:123 at ProtoBuf.Grpc.Configuration.ClientFactory+DefaultProxyCache`1[TService]..cctor () [0x00000] in //src/protobuf-net.Grpc/Configuration/ClientFactory.cs:81

我的项目使用了 gRPC-Web、Blazor web assembly 和 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;
    }
}

至于数据合同:

[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; }
}

在我返回服务中的客户列表之前,但我意识到我需要一个 class 来对消息建模,以便 protobuf-net 能够序列化,这就是为什么 CustomerResultSet.尽管如此,它还是行不通。 非常感谢任何帮助

那是……奇怪。 I can't repro it here,所以我猜这是 Blazor 特有的东西。我检查了代码在“常规”框架中的作用,并且 至少对我来说 它似乎做了正确的事情 - 使用 UnaryValueTaskAsync<Customer, Customer>()UnaryValueTaskAsync<Empty, CustomerResultSet>() ,这是我所期望的。我改进了该代码路径中的异常处理,至少让我们知道它正在尝试做什么,所以我的建议是:

  • 更新到 protobuf-net.Grpc 版本 >= 1.0.119(我会在 CI 完成后立即部署它)
  • 重试,让我确切知道它说的是什么现在

或者,如果您有一个最小的复制 包括 blazor 位 ,比如 GitHub 存储库,我可以很高兴地在那里看看。

(提示:我尝试同时关注 Stack Overflow 和 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(字符串 companyGuid);

然后它又开始工作了。这个错误有点令人困惑,因为我没有使用 ChangeCompany,但正如所说,没有调用在工作。