gpt4 book ai didi

c# - 在 C# 中 gRPC\Protobuf 中的反射

转载 作者:行者123 更新时间:2023-12-05 07:16:16 26 4
gpt4 key购买 nike

由于 C# 中缺少示例,我无法在 gRPC\Protobuf 中进行反射工作。一个应用程序将提供所有接口(interface)和消息的一个版本。

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 是否提供给所有接口(interface)和消息?我如何在 C# 中做到这一点?

感谢您的帮助...

最佳答案

如果我理解正确的话,你想看看客户端和服务器是否与所有 .proto 文件同步。

这是一个必须进行调整但除此之外还是可行的解决方案。

这仅在服务器启用了反射时才有效——可能并非所有地方都适用。

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

        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();

关于c# - 在 C# 中 gRPC\Protobuf 中的反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59324977/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com