Imports System.Configuration Imports System.IO Imports System.Net Imports System.Net.Http Imports System.Net.Http.Headers Imports System.Net.Http.Json Imports Microsoft.Extensions.Configuration Public Class TsNotificacionesClient Private ReadOnly _http As HttpClient Private ReadOnly _idAplicacion As Integer Public Sub New(baseUrl As String, idAplicacion As Integer, apiKey As String) _idAplicacion = idAplicacion ServicePointManager.ServerCertificateValidationCallback = Function(s, c, ch, e) True ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 Or SecurityProtocolType.Tls11 _http = New HttpClient() With {.BaseAddress = New Uri(baseUrl)} _http.DefaultRequestHeaders.Add("X-Api-Key", apiKey) End Sub Public Shared Async Function RegistrarAsync(titulo As String, descripcion As String, TipoNotificacion As TipoNotificacionEnum, Optional Fichero As Byte() = Nothing) As Task Try ServicePointManager.ServerCertificateValidationCallback = Function(s, c, ch, e) True ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 Or SecurityProtocolType.Tls11 'Dim baseUrl = ConfigurationManager.AppSettings("TsNotificaciones:ApiUrl") 'Dim idAplicacion = Integer.Parse(ConfigurationManager.AppSettings("TsNotificaciones:IdAplicacion")) 'Dim apiKey = ConfigurationManager.AppSettings("TsNotificaciones:ApiKey") 'Dim http = New HttpClient() With {.BaseAddress = New Uri(baseUrl)} 'Dim NombreServidor = ConfigurationManager.AppSettings("TsNotificaciones:ApiKey") 'If NombreServidor = "" Then NombreServidor = System.Environment.MachineName Dim config = New ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", [optional]:=False).Build() Dim apiUrl = If(config("TsNotificaciones:ApiUrl"), "http://localhost:7159") Dim idAplicacion = Integer.Parse(If(config("TsNotificaciones:IdAplicacion"), "1")) Dim apiKey = If(config("TsNotificaciones:ApiKey"), String.Empty) Dim nombreServidor = If(config("TsNotificaciones:NombreServidor"), Environment.MachineName) Dim http = New HttpClient() With {.BaseAddress = New Uri(apiUrl)} Dim Tipo = CInt(TipoNotificacion) Dim request = New HttpRequestMessage(HttpMethod.Post, "/api/alertas/registrar") request.Headers.Add("X-Api-Key", apiKey) Dim ipServidor As String = ObtenerIp() request.Content = JsonContent.Create(New With {idAplicacion, nombreServidor, ipServidor, titulo, descripcion, Tipo}) Dim response = Await http.SendAsync(request) Dim body As System.Text.Json.JsonElement = Await response.Content.ReadFromJsonAsync(Of System.Text.Json.JsonElement)() Dim id = body.GetProperty("id").GetInt32() If Fichero IsNot Nothing Then Await SubirFichero(http, apiKey, id, Fichero) End If Catch ex As Exception Throw New Exception(ex.Message, ex) End Try End Function Private Shared Async Function SubirFichero(ByVal http As HttpClient, ByVal apiKey As String, ByVal alertaId As Integer, ByVal datos As Byte()) As Task Try Dim fileContent = New ByteArrayContent(datos) fileContent.Headers.ContentType = New MediaTypeHeaderValue("image/png") Dim multipart = New MultipartFormDataContent() multipart.Add(fileContent, "archivo", "Imagen.png") Dim request = New HttpRequestMessage(HttpMethod.Post, $"/api/alertas/{alertaId}/archivo") request.Headers.Add("X-Api-Key", apiKey) request.Content = multipart Dim response = Await http.SendAsync(request) Dim ok As Boolean = response.IsSuccessStatusCode If Not ok Then Throw New Exception($"Subida fallida ({response.StatusCode}): {Await response.Content.ReadAsStringAsync()}") Catch httpEx As Exception Throw New Exception End Try End Function Private Shared Function ObtenerIp() As String For Each addr In Dns.GetHostAddresses(Dns.GetHostName()) If addr.AddressFamily = Sockets.AddressFamily.InterNetwork Then Return addr.ToString() Next Return "127.0.0.1" End Function 'Private Shared Function EscaparJson(s As String) As String ' Return s.Replace("\", "\\").Replace("""", "\""").Replace(vbCr, "\r").Replace(vbLf, "\n") 'End Function Public Enum TipoNotificacionEnum INFO = 0 ADVERTENCIA = 1 [ERROR] = 2 CRÍTICO = 3 End Enum End Class