Ошибка вызова GRPC : недопустимые ошибки при публикации подраздела Google pub. .net 4.5.2

# #.net #grpc #.net-4.5 #gcloud #google-cloud-pubsub

Вопрос:

У меня есть веб-приложение, которое публикует сообщения в теме для определенных действий пользователя. Я получаю приведенную ниже ошибку каждый раз, когда пытаюсь опубликовать сообщение в теме в экземпляре вычислительного движка.

 PublisherClient publisher = PublisherClient.CreateAsync(new TopicName(projectId, topicName)).Resu<
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 в рамках того же проекта, создав приложение с использованием Visual studio с тем же исходным кодом для удаленной отладки. Я могу публиковать там темы. Этот сервер имеет те же права доступа к IAM.

Роль принадлежит учетной записи пользовательской службы "roles/pubsub.publisher" .

Цель .net framework - 4.5.2

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

Приведенная ниже ссылка указывает на аналогичную проблему в клиентской библиотеке Google ads, и, по словам представителя 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 и клиент хранилища , но эта проблема застала меня врасплох.

Дайте мне знать, если мне понадобится поделиться дополнительной информацией. Заранее благодарю вас за помощь.

Комментарии:

1. Я не знаю, что здесь означает ошибка, но побочное замечание: не используйте . Результат или .Wait(); для унарных вызовов gRPC обычно выдает шаблоны синхронизации и асинхронности; либо ожидайте асинхронную версию, либо используйте версию синхронизации

Ответ №1:

В последнее время я не очень часто использовал 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
 

Возможно, у вас конфликт зависимостей между 2 виртуальными машинами? Я запустил вышесказанное в контейнере Microsoft .NET Core, который обеспечивает согласованность.

приложение.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>