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 的所有帮助,希望这对其他人有所帮助。
我正在努力让使用 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 的所有帮助,希望这对其他人有所帮助。