【问题标题】:Xamarin.Forms and gRPC. "failed to connect to all addresses" error messageXamarin.Forms 和 gRPC。 “无法连接到所有地址”错误消息
【发布时间】:2021-12-28 13:00:46
【问题描述】:

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

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

我正在使用 Grpc.Core 库和带有以下代码的 Grpc.Core.Xamarin(版本 2.41.1)。我也尝试过使用 1.20.1 版本,但没有成功。以下代码尝试连接到仅返回 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");

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

我们将不胜感激。

【问题讨论】:

  • 你需要使用服务器的实际IP
  • 只是为了澄清@Jason,你的意思是我需要发布服务器然后尝试访问它吗?我目前正在通过 Visual Studio(所以 IIS Express)运行它,我认为 Keyoti 从 Conveyor 生成的远程 URL 基本上是为我做的。
  • 可以在本地服务器上运行,但需要使用真实IP。 localhost 将导致 iOS/Android 尝试连接到它们自己,而不是服务器
  • 对,这是有道理的,但是 Keyoti 的 Conveyor 提供的 RemoteURL 不应该工作吗?我也尝试使用我的外部 IP,但没有奏效。
  • 这些东西通常是连接问题。尝试在您的服务器上发布一个静态网页并验证您是否可以从设备浏览器加载它

标签: c# xamarin.forms grpc .net-standard


【解决方案1】:

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

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

要在不将我的 gRPC 服务器发布到其他设备的情况下解决此问题,我只需更改我的 gRPC 服务器的 launchSettings.json 文件中的 applicationUrl,以便它专门监听我的内部 IP 地址,而不是 localhost。我的 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 的所有帮助,希望这对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 2021-12-06
    • 1970-01-01
    • 2020-05-06
    • 2019-12-27
    • 1970-01-01
    • 2021-05-12
    • 2021-04-08
    • 2021-07-19
    • 2021-09-21
    相关资源
    最近更新 更多