From e85dd698952a35970d490bf77fe84e0fb0a49b51 Mon Sep 17 00:00:00 2001 From: Rene Evertz Date: Mon, 30 Mar 2026 13:06:03 +0200 Subject: [PATCH] Status Endpunkt --- Host/Host.csproj | 2 + Host/StatusService.svc | 1 + Host/Web.config | 3 + Host/status.htm | 9 ++ Service/Core/ServiceValidator.cs | 12 ++- Service/Service.csproj | 2 + .../Enhanced/IStatusService.cs | 20 ++++ .../Enhanced/StatusServiceImp.cs | 99 +++++++++++++++++++ Shared/DataContracts/ServerStatusDC.cs | 25 +++++ Shared/DataContracts/ServiceStatusDC.cs | 22 +++++ Shared/Shared.csproj | 2 + 11 files changed, 195 insertions(+), 2 deletions(-) create mode 100644 Host/StatusService.svc create mode 100644 Host/status.htm create mode 100644 Service/ServiceContracts/Enhanced/IStatusService.cs create mode 100644 Service/ServiceImplementations/Enhanced/StatusServiceImp.cs create mode 100644 Shared/DataContracts/ServerStatusDC.cs create mode 100644 Shared/DataContracts/ServiceStatusDC.cs diff --git a/Host/Host.csproj b/Host/Host.csproj index ab06da2e5..2d8a29af7 100644 --- a/Host/Host.csproj +++ b/Host/Host.csproj @@ -199,9 +199,11 @@ + + diff --git a/Host/StatusService.svc b/Host/StatusService.svc new file mode 100644 index 000000000..a9a9ad88d --- /dev/null +++ b/Host/StatusService.svc @@ -0,0 +1 @@ +<%@ ServiceHost Language="C#" Debug="true" Service="BeWo.Service.ServiceImplementations.Enhanced.StatusServiceImp" %> diff --git a/Host/Web.config b/Host/Web.config index 67d9a3790..f4fafcc35 100644 --- a/Host/Web.config +++ b/Host/Web.config @@ -307,6 +307,9 @@ + + + diff --git a/Host/status.htm b/Host/status.htm new file mode 100644 index 000000000..e92bc4b4d --- /dev/null +++ b/Host/status.htm @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Service/Core/ServiceValidator.cs b/Service/Core/ServiceValidator.cs index 7a9f7051e..e268c94d2 100644 --- a/Service/Core/ServiceValidator.cs +++ b/Service/Core/ServiceValidator.cs @@ -11,6 +11,7 @@ using System.ServiceModel; using System.ServiceModel.Channels; using System.Text; using System.Threading.Tasks; +using System.Web; namespace BeWo.Service.Core { @@ -67,8 +68,15 @@ namespace BeWo.Service.Core var prop = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name]; lTenant = prop?.Headers["tenant"]; - // Wenn kein Tenant gefunden wird, - if (string.IsNullOrWhiteSpace(lTenant)) + if (string.IsNullOrWhiteSpace(lTenant) && prop is object) + { + var dict = HttpUtility.ParseQueryString(prop.QueryString); + + lTenant = dict["Tenant"]; + } + + // Wenn kein Tenant gefunden wird, + if (string.IsNullOrWhiteSpace(lTenant)) { throw new ArgumentException($"Zugriff verweigert. Tenant (\'{lTenant}\') darf nicht leer sein.", nameof(lTenant)); } diff --git a/Service/Service.csproj b/Service/Service.csproj index 154de074b..21f19690e 100644 --- a/Service/Service.csproj +++ b/Service/Service.csproj @@ -545,6 +545,7 @@ + @@ -569,6 +570,7 @@ + diff --git a/Service/ServiceContracts/Enhanced/IStatusService.cs b/Service/ServiceContracts/Enhanced/IStatusService.cs new file mode 100644 index 000000000..343f981a6 --- /dev/null +++ b/Service/ServiceContracts/Enhanced/IStatusService.cs @@ -0,0 +1,20 @@ +using BeWo.Service.Attributes; +using BS.Shared.DataContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.ServiceModel.Web; +using System.ServiceModel; +using System.Text; +using System.Threading.Tasks; + +namespace BeWo.Service.ServiceContracts.Enhanced +{ + [ServiceContract] + public interface IStatusService + { + [OperationContract] + [WebGet(UriTemplate = "/Status", ResponseFormat = WebMessageFormat.Json)] + ServerStatusDC GetStatus(); + } +} diff --git a/Service/ServiceImplementations/Enhanced/StatusServiceImp.cs b/Service/ServiceImplementations/Enhanced/StatusServiceImp.cs new file mode 100644 index 000000000..281086ddf --- /dev/null +++ b/Service/ServiceImplementations/Enhanced/StatusServiceImp.cs @@ -0,0 +1,99 @@ +using BeWo.Data.Access; +using BeWo.Data.Entities; +using BeWo.Service.Attributes; +using BeWo.Service.Core; +using BeWo.Service.ServiceContracts.Enhanced; +using BS.Shared.DataContracts; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.ServiceModel; +using System.ServiceModel.Web; +using System.Text; +using System.Threading.Tasks; + +namespace BeWo.Service.ServiceImplementations.Enhanced +{ + [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, + ConcurrencyMode = ConcurrencyMode.Single)] + public class StatusServiceImp : IStatusService + { + public ServerStatusDC GetStatus() + { + var result = new ServerStatusDC + { + ServerTime = DateTime.Now.ToString("o"), + Version = Assembly.GetExecutingAssembly() + .GetName().Version?.ToString() ?? "unbekannt", + Services = new List() + }; + + // Datenbankverbindung prüfen + result.DatabaseOk = CheckDatabase(); + + // Einzelne Subsysteme prüfen + result.Services.Add(CheckService("Database", result.DatabaseOk)); + //result.Services.Add(CheckService("Mail", CheckMail())); + result.Services.Add(CheckService("AIModule", CheckAiModule())); + + return result; + } + + private bool CheckDatabase() + { + try + { + // Leichter DB-Ping – z.B. eine einfache Abfrage über DAOFactory + DAOFactory.GenericDAO.GetAll(); + return true; + } + catch + { + return false; + } + } + + private bool CheckMail() + { + try + { + // z.B. SMTP-Verbindung kurz aufbauen und sofort schließen + // Kann auch weggelassen / später ergänzt werden + return true; + } + catch + { + return false; + } + } + + private bool CheckAiModule() + { + try + { + // #1 + var configPath = ConfigReader.GetConfigPath(SpecialConfig.CustomPreSystemPrompt); + if (!File.Exists(configPath)) + return false; + + return true; + } + catch + { + return false; + } + } + + private ServiceStatusDC CheckService(string name, bool ok) + { + return new ServiceStatusDC + { + Name = name, + IsOk = ok, + Message = ok ? "OK" : "Fehler" + }; + } + } +} diff --git a/Shared/DataContracts/ServerStatusDC.cs b/Shared/DataContracts/ServerStatusDC.cs new file mode 100644 index 000000000..cbc1b4c53 --- /dev/null +++ b/Shared/DataContracts/ServerStatusDC.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace BS.Shared.DataContracts +{ + [DataContract] + public class ServerStatusDC + { + [DataMember] + public string ServerTime { get; set; } + + [DataMember] + public string Version { get; set; } + + [DataMember] + public bool DatabaseOk { get; set; } + + [DataMember] + public List Services { get; set; } + } +} diff --git a/Shared/DataContracts/ServiceStatusDC.cs b/Shared/DataContracts/ServiceStatusDC.cs new file mode 100644 index 000000000..6b6523795 --- /dev/null +++ b/Shared/DataContracts/ServiceStatusDC.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace BS.Shared.DataContracts +{ + [DataContract] + public class ServiceStatusDC + { + [DataMember] + public string Name { get; set; } + + [DataMember] + public bool IsOk { get; set; } + + [DataMember] + public string Message { get; set; } + } +} diff --git a/Shared/Shared.csproj b/Shared/Shared.csproj index d3b7acb83..86a70203f 100644 --- a/Shared/Shared.csproj +++ b/Shared/Shared.csproj @@ -347,6 +347,8 @@ + +