Ошибка разрешения DNS gRPC при использовании имени компьютераC#

Место общения программистов C#
Ответить
Anonymous
 Ошибка разрешения DNS gRPC при использовании имени компьютера

Сообщение Anonymous »

Я новичок в gRPC и пытаюсь изучить его, используя пример чат-сервера/клиента из cactuaroid здесь. Я изменил код, чтобы показать ход выполнения приложения WPF после длительной задачи. Весь код работает на .NET 5, и я использую последние версии пакетов gRPC.
Процесс работает нормально при использовании IP-адреса компьютера, но при использовании имени компьютера для клиента gRPC я получаю исключение «Ошибка разрешения DNS» (имя компьютера — «skylake»):

RpcException: Status(StatusCode="Unavailable", Detail="DNS) разрешение
не удалось для службы: skylake:6001",
DebugException="Grpc.Core.Internal.CoreErrorDetailException:
{"created":"@1615312867.300000000","description":"Переходный процесс резольвера
failure","file":"......\src\core\ext\filters\client_channel\client_channel.cc","file_line":2138,"referenced_errors":[{"created":"@1615312867.300000000","description":"DNS
не удалось разрешить службу:
skylake:6001","file":"......\src\core\ext\filters\client_channel\resolver\dns\c_ares\dns_resolver_ares.cc","f ile_line":362,"grpc_status":14,"referenced_errors":[{"created":"@1615312867.300000000","description":"C-ares
статус не ARES_SUCCESS qtype=AAAA name=skylake is_balancer=0:
Не удалось связаться с DNS
servers","file":"......\src\core\ext\filters\client_channel\resolver\dns\c_ares\grpc_ares_wrapper.cc","file_line":716,"referenced_errors":[{"created":"@1615312866.142000000","description":"C-ares
status не является ARES_SUCCESS qtype=A name=skylake is_balancer=0: Не удалось
не связаться с DNS
серверами","file":"......\src\core\ext\filters\client_channel\resolver\dns\c_ares\grpc_ares_wrapper.cc","file_line":716}]}]}]}")

Я проверил, что могу подключиться к порту с помощью telnet skylake 6001.
Я тестирую локально, клиент и сервер на одной машине. Как ни странно, сервер gRPC, похоже, прекрасно справляется с именем компьютера. Проблема только в клиенте.
Код сервера:
[Export(typeof(IService))]
public class ProgressServiceGrpcServer : Progress.ProgressBase, IService
{
[Import]
private Logger m_logger = null;

[Import]
private ProgressService m_progressService = null;
private readonly Empty m_empty = new Empty();

private const int Port = 6001;
private readonly Grpc.Core.Server m_server;

public ProgressServiceGrpcServer()
{
m_server = new Grpc.Core.Server
{
Services =
{
Progress.BindService(this)
.Intercept(new IpAddressAuthenticator())
},
Ports =
{
new ServerPort("skylake", Port, ServerCredentials.Insecure)
}
};
}

public void Start()
{
m_server.Start();
m_logger.Info("Started.");
}

public override async Task Subscribe(ChannelName channelName, IServerStreamWriter
responseStream, ServerCallContext context)
{
context.CancellationToken.Register(() => m_logger.Info($"{context.Host} cancels subscription."));

try
{
await m_progressService.GetProgressReportsAsObservable(channelName)
.ToAsyncEnumerable()
.ForEachAwaitAsync(async (x) => await responseStream.WriteAsync(x), context.CancellationToken)
.ConfigureAwait(false);
}
catch (TaskCanceledException)
{
m_logger.Info($"{context.Host} unsubscribed.");
}
}

public override Task Write(ProgressReport request, ServerCallContext context)
{
m_logger.Info($"{context.Host} {request}");
m_progressService.Add(request);
return Task.FromResult(m_empty);
}
}

Код клиента:
public class ProgressServiceClient
{
private readonly Progress.ProgressClient m_client =
new Progress.ProgressClient(
new Channel("skylake”, 6001, ChannelCredentials.Insecure));

public async Task Write(ProgressReport progressReport)
{
await m_client.WriteAsync(progressReport);
}

public IAsyncEnumerable
ProgressReports(ChannelName channelName)
{
var call = m_client.Subscribe(channelName);

return call.ResponseStream
.ToAsyncEnumerable()
.Finally(() => call.Dispose());
}
}

Метод записи прогресса:
while (inProgress)
{
progressServiceClient.Write(new GrpcServer.ProgressReport
{
Id = Task.Id.ToString(),
PercentDone = percentDone,
TimeRemain = timeRemain
}).Wait();

Thread.Sleep(500);
}

Метод чтения прогресса:
m_progressService = new ProgressServiceClient();
ChannelName channelName = new ChannelName() { Id = id };

var cts = new CancellationTokenSource();
_ = m_progressService.ProgressReports(channelName)
.ForEachAsync((x) =>
{
Log.Debug($"id: {x.Id} progress: {x.PercentDone}");
}, cts.Token);

this.Dispatcher.Invoke(() =>
{
Application.Current.Exit += (_, __) => cts.Cancel();
this.Unloaded += (_, __) => cts.Cancel();
});


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

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

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

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

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

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