簡體   English   中英

gRPC\Protobuf中的反射C#

[英]Reflection in gRPC \ Protobuf in C#

由於 C# 中缺少示例,我無法在 gRPC\Protobuf 中進行反射。 一個應用程序將提供所有接口和消息的一個版本。

syntax = "proto3";
import "google/protobuf/descriptor.proto";

option csharp_namespace = "Addressbook.Services";

extend google.protobuf.FileOptions {
  string version = 50000;
}

option (version) = "1.2.3.0";

service AddressBookService {
...

客戶端是否有可能通過反射解析連接的服務器? 是否提供給所有接口和消息的version 我如何在 C# 中做到這一點?

謝謝你的幫助...

如果我理解正確的話,你想看看客戶端和服務器是否與 all.proto 文件同步。

這是一個必須進行調整的解決方案,但除此之外還是可行的。

這僅在服務器啟用了反射的情況下才有效——也許並非所有地方都適用。

ServiceName.Descriptor.File中的ServiceName是指protoc生成的class。

        using var channel = _channelFactory.GetChannel();
        var client = new ServerReflection.ServerReflectionClient(channel);
        
        using var call = client.ServerReflectionInfo();

        // To get all service names on the server, you can use this:
        // await call.RequestStream.WriteAsync(new ServerReflectionRequest{ ListServices = ""});
        // await call.ResponseStream.MoveNext(CancellationToken.None);
        // foreach (var serviceResponse in call.ResponseStream.Current.ListServicesResponse.Service)
        // {
        //     _logger.LogInformation("Service name on server: {ServiceName}", serviceResponse.Name);
        // }
        
        await call.RequestStream.WriteAsync(new ServerReflectionRequest{FileContainingSymbol = "name.space.service_name"});
        await call.ResponseStream.MoveNext(CancellationToken.None);
        var descriptorResponse = call.ResponseStream.Current;
        
        // This list has to be reversed. Check `.BuildFromByteStrings` docstring for more info.
        var fileDescriptors = FileDescriptor.BuildFromByteStrings(descriptorResponse.FileDescriptorResponse.FileDescriptorProto.Reverse());
        var localDescriptor = ServiceName.Descriptor.File;
        var relevantFileDescriptor = fileDescriptors.Single(descriptor => descriptor.Name == localDescriptor.Name);

        if (relevantFileDescriptor.SerializedData != localDescriptor.SerializedData)
        {
            _logger.LogWarning("Remote .proto differs from local copy. Please update.");
        }
        else
        {
            _logger.LogInformation(".proto definition matches between client and server.");
        }

        await call.RequestStream.CompleteAsync();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM