System.NotSupportedException:“不支持指定的方法。”使用 protobuf-net.Grpc

问题描述 投票:0回答:1

我收到此错误消息“不支持指定的方法。”当使用 protobuf-het.Grpc

我有这个客户

public class AddressClient
{

    private IAddressService _grpcService;
    public AddressClient(IAddressService grpcService)
    {
        _grpcService = grpcService;
    }

    public AddressClient() {

        GrpcClientFactory.AllowUnencryptedHttp2 = true;
        var http = GrpcChannel.ForAddress("https://localhost:7185");
        _grpcService = http.CreateGrpcService<IAddressService>();
    }

    public async Task<ActionResultDTO<List<AddressModel>>> GetAddresses()
    {
        try
        {
            return await _grpcService.GetAsync(new AddressModel());
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            return null;
        }
    }
}

还有这项服务

public class AddressService : IAddressService
{
    private readonly AddressStore _addressStore;
    public AddressService(AddressStore addressStore) { 
        _addressStore = addressStore ?? throw new ArgumentNullException(nameof(addressStore));
    }
public async ValueTask<ActionResultDTO<List<AddressModel>>> GetAsync(AddressModel addressModel)
{
    try
    {
        var data = await _addressStore.GetAllAsync();
        return new ActionResultDTO<List<AddressModel>> { Data = data, Message = $"Listed Addresses Sucessfuly", Success = true };
    }
    catch (Exception ex)
    {
        return new ActionResultDTO<List<AddressModel>> { Data = null, Message = ex.Message, Success = false };
    }
}
}
[Service(name:"AddressService")]
public interface IAddressService : IBaseService<AddressModel, AddressFilterDTO>
{

}

public interface IBaseService<T, FilterType> where T : class
{
    ValueTask<ActionResultDTO<T>> CreateAsync(T model);

    ValueTask<ActionResultDTO<T>> UpdateAsync(T model);

    ValueTask<ActionResultDTO<T>> DeleteAsync(T model);

    ValueTask<ActionResultDTO<List<T>>> GetAsync(T model);

    ValueTask<ActionResultDTO<T>> GetByIdAsync(int id);

    ValueTask<ActionResultDTO<List<T>>> GetFilterAsync(FilterType filter);
}

我正在尝试使用 GRPC 客户端连接到该服务并收到该错误消息 地址模型也是从类名基本模型继承的,这两个模型看起来像这样。

[ProtoContract]
public class AddressModel : BaseModel
{
    [ProtoMember(5)]
    public string? District { get; set; }

    [ProtoMember(6)]
    public string? City { get; set; }

    [ProtoMember(7)]
    public string? State { get; set; }

    [ProtoMember(8)]
    public string? ZipCode { get; set; }

    [ProtoMember(9)]
    public string? Latitude { get; set; }

    [ProtoMember(10)]
    public string? Longitude { get; set; }

    [ProtoMember(11)]
    public string? Line1 { get; set; }

    [ProtoMember(12)]
    public string? line2 { get; set; }
}
[ProtoContract]
public abstract class BaseModel
{
    [ProtoMember(1)]
    public Int64 Id { get; set; }

    [ProtoMember(2)]
    public DateTime CreationDate { get; set; }

    [ProtoMember(3)]
    public DateTime LastUpdated { get; set; }

    [ProtoMember(4)]
    public int Status { get; set; }
}

c# .net grpc .net-8.0 protobuf-net.grpc
1个回答
0
投票

这只是所提供代码的提示

  • 对于类使用[ServiceContract],对于成员使用[OperationContract]。
  • 使用[DataContract]而不是[ProtoContract]。
  • 尝试简化泛型,至少从一个简单的工作原型开始。

这里是 gRpc 工作的完整示例 https://github.com/grpc/grpc-dotnet/tree/master/examples/Coder

© www.soinside.com 2019 - 2024. All rights reserved.