# #.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>