GRPC CallError:发布 Google pub sub Topic 时出现 InvalidFlags。 .net 4.5.2

Posted

技术标签:

【中文标题】GRPC CallError:发布 Google pub sub Topic 时出现 InvalidFlags。 .net 4.5.2【英文标题】:GRPC CallError : InvalidFlags while publishing Google pub sub Topic. .net 4.5.2 【发布时间】:2021-11-02 13:13:36 【问题描述】:

我有一个网络应用程序,它为某些用户活动向主题发布消息。 每次尝试将消息发布到计算引擎实例中的主题时,我都会收到以下错误。

PublisherClient publisher = PublisherClient.CreateAsync(new TopicName(projectId, topicName)).Result;
var t = publisher.PublishAsync(serializer.Serialize(topicName.TopicId, message));
t.Wait();

|Result="Call error: InvalidFlags"|ExTyp=System.InvalidOperationException|ExMsg=Call error: InvalidFlags
|EX=System.InvalidOperationException: Call error: InvalidFlags
   at Grpc.Core.Internal.CallErrorExtensions.CheckOk(CallError callError)
   at Grpc.Core.Internal.CallSafeHandle.StartUnary(IUnaryResponseClientCallback callback, Byte[] payload, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags callFlags)
   at Grpc.Core.Internal.AsyncCall`2.UnaryCallAsync(TRequest msg)
   at Grpc.Core.Calls.AsyncUnaryCall[TRequest,TResponse](CallInvocationDetails`2 call, TRequest req)
   at Grpc.Core.DefaultCallInvoker.AsyncUnaryCall[TRequest,TResponse](Method`2 method, String host, CallOptions options, TRequest request)
   at Grpc.Core.Interceptors.InterceptingCallInvoker.<AsyncUnaryCall>b__4_0[TRequest,TResponse](TRequest req, ClientInterceptorContext`2 ctx)
   at Grpc.Core.ClientBase.ClientBaseConfiguration.ClientBaseConfigurationInterceptor.AsyncUnaryCall[TRequest,TResponse](TRequest request, ClientInterceptorContext`2 context, AsyncUnaryCallContinuation`2 continuation)
   at Grpc.Core.Interceptors.InterceptingCallInvoker.AsyncUnaryCall[TRequest,TResponse](Method`2 method, String host, CallOptions options, TRequest request)
   at Google.Cloud.PubSub.V1.Publisher.PublisherClient.PublishAsync(PublishRequest request, CallOptions options)
   at Google.Api.Gax.Grpc.ApiCall.GrpcCallAdapter`2.CallAsync(TRequest request, CallSettings callSettings)
   at Google.Api.Gax.Grpc.ApiCallRetryExtensions.<>c__DisplayClass0_0`2.<<WithRetry>b__0>d.MoveNext()

计算引擎实例正在使用具有必要 IAM 权限的自定义服务帐户。

要指出的另一件事是,我在同一个项目中的另一个 GCP 计算实例 Jump 服务器中重新创建了环境,方法是使用 Visual Studio 构建应用程序,并使用相同的源代码进行远程调试。我可以在那里发布主题。此服务器具有相同的 IAM 权限。

自定义服务帐户具有"roles/pubsub.publisher"role。

目标.net framework - 4.5.2

using Google.Cloud.PubSub.V1; v1.1.0

以下链接指向 Google 广告客户端库中的类似问题,根据 google 代表的说法,这是库中的问题。 https://groups.google.com/g/adwords-api/c/zSYZKy4J41o

我知道调用错误是枚举的一部分 https://chromium.googlesource.com/external/github.com/grpc/grpc/+/chromium-deps/2016-07-19/src/csharp/Grpc.Core/Internal/CallError.cs ,但我不知道为什么它在主 GCE 实例中失败。

如果这不起作用,我将不得不使用 API 调用,但有什么方法可以让这个客户端库正常工作吗?

我已经实现了 SecretManager StorageClient ,但是这个问题让我措手不及。

如果我需要分享更多信息,请告诉我。提前感谢您的帮助。

【问题讨论】:

我不知道这里的错误是什么意思,但侧面观察:不要使用 .Result 或 .Wait();对于一元调用,gRPC 通常同时发出同步和异步模式;要么等待异步版本,要么使用同步版本 【参考方案1】:

我最近没有使用 C#,所以提前道歉。

使用 .NET Core 5.0 (!?) 以及 Cloud PubSub v1 的旧版本 (v1.1.0) 和当前 (v.2.6.0) 版本,为我工作:

using Google.Apis.Auth.OAuth2;
using Google.Cloud.PubSub.V1;
using System;
using System.Text;
using System.Threading.Tasks;

namespace app

    class Program
    

        static async Task<int> Main(string[] args)
        
            string projectId=Environment.GetEnvironmentVariable("PROJECT");
            
            string topicId="foo";

            PublisherClient publisher = await PublisherClient.CreateAsync(
                new TopicName(projectId, topicId));
            var t = await publisher.PublishAsync(
                Encoding.ASCII.GetBytes("Hello Freddie"));

            return 0;
        
    

还有:

gcloud pubsub subscriptions pull foo-sub \
--project=$PROJECT \
--format="value(message.data)"
Hello Freddie

也许你有两个虚拟机之间的依赖冲突?我在提供一致性的 Microsoft .NET Core 容器中运行了上述内容。

app.csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Google.Cloud.PubSub.V1" Version="2.6.0" />
    <PackageReference Include="Grpc.Core" Version="2.40.0-pre1" />
  </ItemGroup>

</Project>

【讨论】:

以上是关于GRPC CallError:发布 Google pub sub Topic 时出现 InvalidFlags。 .net 4.5.2的主要内容,如果未能解决你的问题,请参考以下文章

GRPC 1.15.0 发布,Google 高性能 RPC 框架

Google高性能RPC框架gRPC 1.0.0发布

Google People API 返回 Grpc 状态码 null

google多语言通信框架gRPC

如何为 gRPC 生成的 Java 代码实现 com.google.protobuf.BlockingRpcChannel?

使用 GRPC 与 Google Cloud Run 通信的 Google App Engine 给出“错误:14 不可用:连接已断开”