Buenas a todos:
Definitivamente la programación en red no es lo mío ^^U O más bien, tengo un enorme hueco de conocimientos al respecto de usar librerías de comunicación en red.
A ver, tengo una API en red, que se presenta mediante, según leo, OData 3 o bien OData 4.
Hasta ahora, yo me creaba una WebApi y hacía las peticiones por http, pero ahora tengo que modificar el sistema para llamar a esta nueva API por https, y a pesar de que sigo las instrucciones, no consigo conectar.
El manual es muy genérico, no es específico de C#, por lo que sólo indica que para hacer login en el sistema deba mandar lo siguiente:
Lo he intentado con Postman, y he podido mandar la info sin problemas... Bueno, me ha salido un mensaje de no se qué de TTS y lo he desactivado, y funciona (lo digo porque parece relevante).Código:POST https://<server IP>:<port>/Login {"User": "admin", "Password": "1234"}
Vale, pues este es mi código:
Como veis, no hago nada raro (y quizás ese sea el problema, que falte algo). Pues este código me devuelve el siguiente mensaje de excepción en la línea del client.PostAsync:Código:public static async Task Login () { HttpResponseMessage response = null; HttpClient client = new HttpClient { BaseAddress = new Uri("192.168.1.2:55000") }; HttpContent content; SLDataConnection data; string tempString; try { //Setting header as JSON client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); data = new SLDataConnection() { User = "admin", Password = "1234" }; //Envío del mensaje content = new StringContent(JsonConvert.SerializeObject(data), System.Text.Encoding.UTF8, "application/json"); System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12 | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls; response = await client.PostAsync("Login", content); if (response == null) response = new HttpResponseMessage() { StatusCode = System.Net.HttpStatusCode.InternalServerError, ReasonPhrase = "Error de conexión" }; if (response.StatusCode == System.Net.HttpStatusCode.OK) { tempString = await response.Content.ReadAsStringAsync(); //data = JsonConvert.DeserializeObject<InfoLoginModel>(tempString); } else { WriteInLog("Error de conexión " + ((int)response.StatusCode).ToString() + ": " + response.ReasonPhrase); } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("****** EXCEPTION: " + ex); WriteInLog("Excepción del programa:" + ex.Message); } }
"System.Net.Http.HttpRequestException: Error al enviar la solicitud. ---> System.Net.WebException: Se ha terminado la conexión: No se puede establecer una relación de confianza para el canal seguro SSL/TLS. ---> System.Security.Authentication.AuthenticationExcep tion: El certificado remoto no es válido según el procedimiento de validación."
Os daría más información, pero no la tengo.
He visto por internet que puedo usar Postman para obtener información de los metadatos de conexión, y usarlos para añadirlos como xml a las referencias del proyecto, y así consumir las llamadas a la API como si fueran funciones:
https://blogs.sap.com/2015/07/15/how...m-net-via-wcf/
Pero en el servidor de desarrollo usamos una BBDD común para varios proyectos, y los metadatos obtenidos son diferentes de los que van a tener los clientes finales (por las referencias a una serie de tablas y campos personalizados), por lo que no lo veo muy buena idea. Por eso intento hacerlo de esta forma tan "rudimentaria", porque una vez logeado, cada nueva llamada es coger los datos devueltos, meterlos en la cabecera, y añadir un JSON con los datos solicitados, que no es muy diferente a lo que se hacía hasta ahora (aunque tengo que modificar las clases "models" para que tengan los mismos campos que la nueva API).
Estamos pendientes de que nos den una formación al respecto, pero mientras, necesito avanzar por mi cuenta.
¿Alguna idea? Muchas gracias.
PD: Según he seguido leyendo, veo que es importante decir que el proyecto usa .NET Framework 4.5.2 (porque hay un callback para deshabilitar la seguridad que no tengo), y que por lo general, el programa que proporciona la API web, generalmente, en otros apartados de configuración que se hacen a través del navegador, Chrome suele dar el aviso de que no se puede confiar en el certificado de seguridad de la web... pero es porque creo que no implementa ninguno. Supongo que como está hecho para que el sistema funcione en local, les da igual el tema de seguridad... o es que no sabemos cómo instalarlo.
Marcadores