133 lines
5.5 KiB
VB.net
133 lines
5.5 KiB
VB.net
Imports System.Configuration
|
|
Imports System.Diagnostics
|
|
Imports System.IO
|
|
Imports System.Net
|
|
Imports System.Net.Http
|
|
Imports System.Net.Http.Headers
|
|
Imports System.Threading.Tasks
|
|
Imports Newtonsoft.Json
|
|
|
|
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, tipo As TipoNotificacionEnum, Optional fichero As Byte() = Nothing, Optional incluirEnEventLog As Boolean = True) As Task
|
|
Try
|
|
' ============================
|
|
' CARGAR CONFIGURACIÓN
|
|
' ============================
|
|
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
|
|
ServicePointManager.ServerCertificateValidationCallback = Function(sender, cert, chain, sslPolicyErrors) True
|
|
Dim apiUrl As String = ConfigurationManager.AppSettings("TsNotificaciones.ApiUrl")
|
|
Dim idAplicacion As Integer = Integer.Parse(ConfigurationManager.AppSettings("TsNotificaciones.IdAplicacion"))
|
|
Dim aplicacion As String = ConfigurationManager.AppSettings("TsNotificaciones.Aplicacion")
|
|
If aplicacion = "" Then aplicacion = "Tecnosis idAplicacion:" & idAplicacion.ToString
|
|
Dim apiKey As String = ConfigurationManager.AppSettings("TsNotificaciones.ApiKey")
|
|
Dim nombreServidor As String = Environment.MachineName
|
|
|
|
If String.IsNullOrEmpty(apiUrl) Then apiUrl = "http://localhost:7159"
|
|
|
|
' ============================
|
|
' LOG EN EVENT VIEWER
|
|
' ============================
|
|
If incluirEnEventLog Then
|
|
Dim ele As EventLogEntryType
|
|
|
|
Select Case tipo
|
|
Case TipoNotificacionEnum.INFO
|
|
ele = EventLogEntryType.Information
|
|
Case TipoNotificacionEnum.ADVERTENCIA
|
|
ele = EventLogEntryType.Warning
|
|
Case TipoNotificacionEnum.ERROR, TipoNotificacionEnum.CRÍTICO
|
|
ele = EventLogEntryType.Error
|
|
End Select
|
|
|
|
' EventID ≠ 0 para evitar el mensaje de descripción faltante
|
|
Dim eventId As Integer = 1000 + CInt(tipo)
|
|
|
|
EventLog.WriteEntry("Application", $"{aplicacion} {titulo} {descripcion}", ele, eventId)
|
|
End If
|
|
|
|
' ============================
|
|
' LLAMADA A LA API
|
|
' ============================
|
|
Dim http = New HttpClient() With {.BaseAddress = New Uri(apiUrl)}
|
|
http.DefaultRequestHeaders.Add("X-Api-Key", apiKey)
|
|
|
|
Dim payload = New With {
|
|
.idAplicacion = idAplicacion,
|
|
.nombreServidor = nombreServidor,
|
|
.ipServidor = ObtenerIp(),
|
|
.titulo = titulo,
|
|
.descripcion = descripcion,
|
|
.tipoNotificacion = CInt(tipo)
|
|
}
|
|
|
|
Dim json As String = JsonConvert.SerializeObject(payload)
|
|
Dim content As New StringContent(json, System.Text.Encoding.UTF8, "application/json")
|
|
|
|
Dim response = Await http.PostAsync("/api/alertas/registrar", content)
|
|
Dim body As String = Await response.Content.ReadAsStringAsync()
|
|
|
|
Dim jsonObj = JsonConvert.DeserializeObject(Of Dictionary(Of String, Object))(body)
|
|
Dim id As Integer = Convert.ToInt32(jsonObj("id"))
|
|
|
|
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(http As HttpClient, apiKey As String, alertaId As Integer, 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)
|
|
|
|
If Not response.IsSuccessStatusCode Then
|
|
Throw New Exception($"Subida fallida ({response.StatusCode}): {Await response.Content.ReadAsStringAsync()}")
|
|
End If
|
|
|
|
Catch ex As Exception
|
|
Throw New Exception(ex.Message, ex)
|
|
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
|
|
|
|
Public Enum TipoNotificacionEnum
|
|
INFO = 0
|
|
ADVERTENCIA = 1
|
|
[ERROR] = 2
|
|
CRÍTICO = 3
|
|
End Enum
|
|
|
|
End Class
|