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 People API 返回 Grpc 状态码 null
如何为 gRPC 生成的 Java 代码实现 com.google.protobuf.BlockingRpcChannel?
使用 GRPC 与 Google Cloud Run 通信的 Google App Engine 给出“错误:14 不可用:连接已断开”