Невозможно опубликовать сообщение в эмуляторе Pub/Sub с помощью C# .NET Framework 4.8.C#

Место общения программистов C#
Ответить
Anonymous
 Невозможно опубликовать сообщение в эмуляторе Pub/Sub с помощью C# .NET Framework 4.8.

Сообщение Anonymous »

Я не могу опубликовать сообщение в эмуляторе Google Pub/Sub с помощью C# .NET Framework 4.8. В производстве код работает. Это происходит только с эмулятором gcloud.
Кроме того, тот же код работает с C# .NET 8.0 и эмулятором gcloud. Однако мне нужен код для работы с .NET Framework 4.8.
Оба используют одни и те же пакеты:

Код: Выделить всё

Google.Api.Gax = 4.4.0
Google.Cloud.PubSub.V1 = 3.8.0
gcloud обновлен до последней версии:

Код: Выделить всё

>gcloud version
Google Cloud SDK 455.0.0
beta 2023.11.10
bq 2.0.98
core 2023.11.10
gsutil 5.27
pubsub-emulator 0.8.10
Я запускаю эмулятор с помощью этой команды:

Код: Выделить всё

gcloud beta emulators pubsub start --project=my-project --host-port=localhost:8085
Затем создайте тему под названием my-topic.
Я создаю переменную среды:

Код: Выделить всё

setx PUBSUB_EMULATOR_HOST "localhost:8085"
Код C# .NET Framework 4.8:

Код: Выделить всё

using Google.Api.Gax;
using Google.Cloud.PubSub.V1;
using System;
using System.Threading.Tasks;

namespace PubSubDotNetTest
{
internal class Program
{
static void Main(string[] args)
{
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2Support", true);

Subscriber().GetAwaiter().GetResult();
}

static async Task Subscriber()
{
Console.WriteLine("Starting publisher...");

var projectId = "my-project";
var topicId = "my-topic";

PublisherServiceApiClient publisherService = await new PublisherServiceApiClientBuilder
{
EmulatorDetection = EmulatorDetection.EmulatorOrProduction
}.BuildAsync();

TopicName topicName = new TopicName(projectId, topicId);

PublisherClient publisher = await new PublisherClientBuilder
{
TopicName = topicName,
EmulatorDetection = EmulatorDetection.EmulatorOrProduction
}.BuildAsync();

await publisher.PublishAsync("Hello, Pubsub1");
await publisher.ShutdownAsync(TimeSpan.FromSeconds(15));

}
}
}
Он возвращается с этим исключением:

Код: Выделить всё

Unhandled Exception: Grpc.Core.RpcException: Status(StatusCode="Internal", Detail="Bad gRPC response.  Response protocol downgraded to HTTP/1.1.")
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Google.Api.Gax.Grpc.ApiCallRetryExtensions.c__DisplayClass0_0`2.d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Google.Cloud.PubSub.V1.Tasks.ForwardingAwaiter`1.GetResult() in /_/apis/Google.Cloud.PubSub.V1/Google.Cloud.PubSub.V1/Tasks/ForwardingAwaiter.cs:line 41
at Google.Cloud.PubSub.V1.Tasks.Extensions.c__DisplayClass5_0`1.d.MoveNext() in /_/apis/Google.Cloud.PubSub.V1/Google.Cloud.PubSub.V1/Tasks/TaskHelper.cs:line 174
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Google.Cloud.PubSub.V1.Tasks.ForwardingAwaiter`1.GetResult() in /_/apis/Google.Cloud.PubSub.V1/Google.Cloud.PubSub.V1/Tasks/ForwardingAwaiter.cs:line 41
at Google.Cloud.PubSub.V1.PublisherClientImpl.
d__32.MoveNext() in /_/apis/Google.Cloud.PubSub.V1/Google.Cloud.PubSub.V1/PublisherClientImpl.cs:line 247
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at PubSubDotNetTest.Program.d__1.MoveNext() in C:\MyPath\Program.cs:line 37
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at PubSubDotNetTest.Program.Main(String[] args) in C:\MyPath\Program.cs:line 12
Это отображается в консоли эмулятора при возникновении исключения:

Код: Выделить всё

[pubsub] Nov 21, 2023 10:37:46 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
[pubsub] INFO: Detected non-HTTP/2 connection.
[pubsub] Nov 21, 2023 10:37:46 AM io.gapi.emulators.netty.NotFoundHandler handleRequest
[pubsub] INFO: Unknown request URI: /google.pubsub.v1.Publisher/Publish
[pubsub] Nov 21, 2023 10:37:46 AM io.gapi.emulators.netty.NotFoundHandler handleRequest
[pubsub] INFO: Unknown request URI: /google.pubsub.v1.Publisher/Publish
[pubsub] Nov 21, 2023 10:37:46 AM io.gapi.emulators.netty.NotFoundHandler handleRequest
[pubsub] INFO: Unknown request URI: /google.pubsub.v1.Publisher/Publish
[pubsub] Nov 21, 2023 10:37:47 AM io.gapi.emulators.netty.NotFoundHandler handleRequest
[pubsub] INFO: Unknown request URI: /google.pubsub.v1.Publisher/Publish
[pubsub] Nov 21, 2023 10:37:52 AM io.gapi.emulators.netty.NotFoundHandler handleRequest
[pubsub] INFO: Unknown request URI:  /google.pubsub.v1.Publisher/Publish
Я попробовал добавить эту строку в качестве первой строки в методе Main:

Код: Выделить всё

AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
Но это не решило проблему.
Я также попробовал этот код:

Код: Выделить всё

static async Task Subscriber()
{
Console.WriteLine("Starting publisher...");

var projectId = "project-id";
var topicId = "topic-id";

string emulatorHostAndPort = Environment.GetEnvironmentVariable("PUBSUB_EMULATOR_HOST");

PublisherServiceApiClient publisherService = await new PublisherServiceApiClientBuilder
{
Endpoint = emulatorHostAndPort,
ChannelCredentials = ChannelCredentials.Insecure
}.BuildAsync();

TopicName topicName = new TopicName(projectId, topicId);

PublisherClient publisher = await new PublisherClientBuilder
{
TopicName = topicName,
Endpoint = emulatorHostAndPort,
ChannelCredentials = ChannelCredentials.Insecure
}.BuildAsync();

await publisher.PublishAsync("Hello, Pubsub1");
await publisher.ShutdownAsync(TimeSpan.FromSeconds(15));
}
Но возвращается с тем же исключением.
Код C# .NET 8.0:

Код: Выделить всё

using Google.Api.Gax;
using Google.Cloud.PubSub.V1;

Console.WriteLine("Starting publisher...");

var projectId = "my-project";
var topicId = "my-topic";

PublisherServiceApiClient publisherService = await new PublisherServiceApiClientBuilder
{
EmulatorDetection = EmulatorDetection.EmulatorOrProduction
}.BuildAsync();

TopicName topicName = new TopicName(projectId, topicId);

PublisherClient publisher = await new PublisherClientBuilder
{
TopicName = topicName,
EmulatorDetection = EmulatorDetection.EmulatorOrProduction
}.BuildAsync();

await publisher.PublishAsync("Hello, Pubsub2");
await publisher.ShutdownAsync(TimeSpan.FromSeconds(15));
Это работает хорошо, и мой эмулятор Pub/Sub получает сообщение.
Как я могу заставить это работать с .NET Framework 4.8?
Это работает хорошо, и мой эмулятор Pub/Sub получает сообщение.
Как я могу заставить это работать с .NET Framework 4.8?
Это работает хорошо, и мой эмулятор Pub/Sub получает сообщение.
Как я могу заставить это работать с .NET Framework 4.8?
Это работает хорошо, и мой эмулятор Pub/Sub получает сообщение.
Как я могу заставить это работать с .NET Framework 4.8?
Это работает хорошо, и мой эмулятор Pub/Sub получает сообщение.
Как я могу заставить это работать с .NET Framework 4.8?
Это работает хорошо, и мой эмулятор Pub/Sub получает сообщение.
Как я могу заставить это работать с .NET Framework 4.8?
п>

Подробнее здесь: https://stackoverflow.com/questions/775 ... -framework
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»