Я пытаюсь отправить запрос из android в службу gRP C. С приложением ядра WPF net, работающим на том же компьютере, оно работает, но с android оно не работает. Также я пробовал это приложение WPF на другом компьютере (на виртуальной машине), и оно тоже отлично работает.
Код моего приложения xamarion:
private void SetVariablesServicio()
{
_serviceAddress = "http://1.2.3.4:5001";
using (StreamReader miCertificado = new StreamReader(Assets.Open("CA.crt")))
{
_caCertificate = miCertificado.ReadToEnd();
}
using (StreamReader miCertificado = new StreamReader(Assets.Open("Client.crt")))
{
_clientCertificate = miCertificado.ReadToEnd();
}
using (StreamReader miCertificado = new StreamReader(Assets.Open("Client.key")))
{
_clientPrivateKey = miCertificado.ReadToEnd();
}
}
private async void btnTestServicio_Click()
{
try
{
GrpcClient.GestorAplicaciones miGrpcClient = new GrpcClient.GestorAplicaciones(_serviceAddress, _caCertificate, _clientCertificate, _clientPrivateKey);
string miSaludo = await miGrpcClient.PingAsync("Álvaro");
ShowAlert("Error", miSaludo);
}
catch (Exception ex)
{
ShowAlert("Error", ex.Message);
}
}
Общая библиотека для gRP C клиенты:
public class GestorAplicaciones
{
#region constructor
public GestorAplicaciones(string paramAddressService, string paramStrCertificadoCa, string paramStrCertificadoCliente, string paramStrClaveCertificadoCliente)
{
_serviceAddress = paramAddressService;
_caCertificate = paramStrCertificadoCa;
_clientCertificate = paramStrCertificadoCliente;
_clientPrivateKey = paramStrClaveCertificadoCliente;
}
#endregion constructor
#region variables de clase
private string _serviceAddress;
private string _caCertificate;
private string _clientPrivateKey;
private string _clientCertificate;
#endregion variables de clase
#region método de llamada al servicio
public async Task<string> PingAsync(string paramStrNombreLlamante)
{
Gestor.GestorClient miClienteGrpc = GetClient();
PingRequest input = new PingRequest { NomreLlamante = paramStrNombreLlamante };
var reply = await miClienteGrpc.PingAsync(input);
return reply.MensajeRespuesta;
}
private Gestor.GestorClient GetClient()
{
var httpClientHandler = new System.Net.Http.HttpClientHandler();
httpClientHandler.ServerCertificateCustomValidationCallback =
System.Net.Http.HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
var httpClient = new System.Net.Http.HttpClient(httpClientHandler);
var channel = GrpcChannel.ForAddress(_serviceAddress,
new GrpcChannelOptions { HttpClient = httpClient });
var client = new Gestor.GestorClient(channel);
return client;
}
Клиент WPF:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
_serviceAddress = "https://1.2.3.4:5001";
_caCertificate = System.IO.File.ReadAllText("certificados/ca.crt");
_clientPrivateKey = System.IO.File.ReadAllText("certificados/client.key");
_clientCertificate = System.IO.File.ReadAllText("certificados/client.crt");
}
#region variables de clase
private readonly string _serviceAddress;
private readonly string _caCertificate;
private readonly string _clientPrivateKey;
private readonly string _clientCertificate;
#endregion variables de clase
private async void Button_Click(object sender, RoutedEventArgs e)
{
try
{
GrpcClient.GestorAplicaciones miGrpcClient = new GrpcClient.GestorAplicaciones(_serviceAddress, _caCertificate, _clientCertificate, _clientPrivateKey);
string miSaludo = await miGrpcClient.PingAsync("Álvaro");
MessageBox.Show(miSaludo);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
Служба:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
// Additional configuration is required to successfully run gRPC on macOS.
// For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(options =>
{
//NOTA: se tiene que poner la IP porque si no, se dice que el equipo remoto ha denegado la conexión.
options.Listen(miAddress, 5001, o =>
{
o.Protocols = HttpProtocols.Http2;
o.UseHttps(@"certificados\service.pfx", "123456");
});
})
.ConfigureLogging(logging =>
{
logging.AddFilter("Grpc", LogLevel.Debug);
});
webBuilder.UseStartup<Startup>();
});
}
Моя идея состоит в том, чтобы иметь общую библиотеку для клиентской стороны, которые могут использоваться клиентами xamarin и wpf.
Я отлаживаю приложение xamarion, развертывающее его на телефоне android.
Почему запрос работает из приложения WPF, а не из приложения WPF Приложение xamarin?
Спасибо.