我有一个web应用程序,发布消息到某个用户活动的主题。每次我试图将消息发布到计算引擎实例中的主题时,我都会得到以下错误。
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"
角色。
目标.net framework - 4.5.2
using Google.Cloud.PubSub.V1; v1.1.0
下面的链接指向谷歌广告客户端库中类似的问题,根据谷歌代表,这是一个库中的问题。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,但是这个问题让我措手不及。
如果我需要分享更多的信息,请告诉我。提前感谢您的帮助。
我最近不怎么使用c#,所以提前道歉。
使用。net Core 5.0(!?)和旧版本(v1.1.0)和当前(v2.6.0)版本的Cloud PubSub v1,为我工作:
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
也许你有两个虚拟机之间的依赖冲突?我在提供一致性的微软。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>