Xamarin.Forms 和 gRPC。 "failed to connect to all addresses" 错误信息

Xamarin.Forms and gRPC. "failed to connect to all addresses" error message

我正在努力让使用 Xamarin.Forms 构建的 gRPC 客户端与本地主机上的 gRPC 服务器 运行 通信。使用 BloomRPC 可以毫无问题地访问服务器,但是我似乎无法从我的客户端让它正常工作。服务器正在侦听 http://localhost:5000 和 https://localhost:5001。

我最初认为可能是因为我的客户正在挣扎的本地主机上是 运行,所以我也尝试使用由 Keyoti 提供的 Conveyor 提供的 RemoteURL,它设置为 http://192.168.1.64:45455 and https://192.168.1.64:45456,但是我不太确定它是如何与我的 gRPC 服务器一起工作的,因为它专门监听端口 5000 和 5001。无论哪种方式,尝试通过任何一种方法连接都会导致 RPCException 指出“无法连接到所有地址”。

我正在使用 Grpc.Core 库和 Grpc.Core.Xamarin(版本 2.41.1)以及以下代码。我也尝试过使用 1.20.1 版,但没有成功。下面的代码尝试连接到身份验证服务,它只是 returns 一个 GUID。

public static async Task<Msg.SessionTokenResponse> test()
{
    // I've also tried, localhost:5000, localhost:5001 (with and without SSL credentials), 
    // 127.0.0.1:5001 (with and without SSL credentials), 0.0.0.0:5000, 0.0.0.0:5001 
    // (with and without SSL credentials), 192.168.1.64:45455, 192.168.1.64:45456 (with and 
    // without SSL credentials)
    var channel = new Channel("127.0.0.1:5000", ChannelCredentials.Insecure);

    var client = new AuthenticationService.AuthenticationServiceClient(channel);
    var request = new Msg.SessionTokenRequest();

    try
    {
        return await client.CreateSessionTokenAsync(request);
    }
    catch(Exception ex)
    {
        Console.WriteLine(ex.Message);
        throw ex;
    }
    finally
    {
        await channel.ShutdownAsync();
    }
}

同样值得注意的是,如果我尝试在地址开头传递 http:// 或 https://,我会收到“DNS 解析失败服务”错误消息。仔细阅读后,看起来这并不意味着作为地址的一部分提供,但我可能误解了这些要求。我已经在禁用防火墙的情况下尝试过此操作,并且没有代理。我还尝试添加以下环境变量:

Environment.SetEnvironmentVariable("NO_PROXY", "127.0.0.1");
Environment.SetEnvironmentVariable("GRPC_DNS_RESOLVER", "native");
Environment.SetEnvironmentVariable("GRPC_VERBOSITY", "debug");
Environment.SetEnvironmentVariable("GRPC_TRACE", "all");

我在日志中看不到任何有用的信息。

我们将不胜感激任何帮助。

在@Jason 的帮助下,我终于解决了这个问题。

正如他所暗示的那样,问题是因为代码是 运行 在模拟器上,而不是我的本地机器上(即使模拟器在我的本地机器上),因此引用 localhost 只会尝试访问模拟器,而不是我的电脑。

为了在不将我的 gRPC 服务器发布到其他设备的情况下解决这个问题,我只需要更改我的 gRPC 服务器的 launchSettings.json 文件中的 applicationUrl,以便它专门监听我的内部 IP 地址,而不是本地主机。我的 launchSettings.json 文件如下所示:

{
  "profiles": {
    "MyGRPCServer.API": {
      "commandName": "Project",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "https://192.168.1.64:45456;http://192.168.1.64:45455"
    }
  }
}

然后我简单地在我的防火墙中将端口 45455 和 45456 列入白名单,并且模拟器能够访问我的 gRPC 服务器。

我也变了

var channel = new Channel("127.0.0.1:5000", ChannelCredentials.Insecure);

var channel = new Channel("192.168.1.64:45455", ChannelCredentials.Insecure);

再次感谢 Jason 的所有帮助,希望这对其他人有所帮助。