繁体   English   中英

Xamarin.Forms 和 gRPC。 “无法连接到所有地址”错误消息

[英]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:45455Z5E056C500A1C4B6A7110B50D8087BADE5Z: // .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");

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

任何和所有的帮助将不胜感激。

在@Jason 的所有帮助之后,我终于能够解决这个问题。

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

为了在不将我的 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 的所有帮助,希望这对其他人有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM