From 3ef49054ca9c1745f75da509b517ef93e5f8f79c Mon Sep 17 00:00:00 2001 From: Meik Date: Wed, 1 Jul 2026 09:34:00 +0200 Subject: [PATCH] chore: clean up journal migration diagnostics --- F4SDM42WebApi/F4SD - M42WebApi.csproj | 2 +- F4SDM42WebApi/F4SDHelperService.cs | 4 -- F4SDM42WebApi/F4SDM42WebApiController.cs | 77 +---------------------- docs/matrix42-26-1-extension-migration.md | 27 +++++--- 4 files changed, 21 insertions(+), 89 deletions(-) diff --git a/F4SDM42WebApi/F4SD - M42WebApi.csproj b/F4SDM42WebApi/F4SD - M42WebApi.csproj index 9de7a57..31a6d7b 100644 --- a/F4SDM42WebApi/F4SD - M42WebApi.csproj +++ b/F4SDM42WebApi/F4SD - M42WebApi.csproj @@ -13,7 +13,7 @@ false 6673a25d-33d6-4072-91d9-abed4be1a966 C4ITF4SD*.* - 1.4.0.35 + 1.4.0.36 true diff --git a/F4SDM42WebApi/F4SDHelperService.cs b/F4SDM42WebApi/F4SDHelperService.cs index 617dbee..a5280e6 100644 --- a/F4SDM42WebApi/F4SDHelperService.cs +++ b/F4SDM42WebApi/F4SDHelperService.cs @@ -1411,10 +1411,6 @@ namespace C4IT.F4SD LogEntry($"{entries.Count} Journal entries found for ObjectID={activityEOID}", LogLevels.Debug); return CreateTicketJournalItems(activityEOID, entries); } - catch (MissingMethodException E) - { - return F4SDM42WebApiController.CreateMissingMethodDiagnostics("GetJournalEntries helper", activityEOID, E); - } catch (Exception E) { LogException(E); diff --git a/F4SDM42WebApi/F4SDM42WebApiController.cs b/F4SDM42WebApi/F4SDM42WebApiController.cs index e4d50d5..9549eed 100644 --- a/F4SDM42WebApi/F4SDM42WebApiController.cs +++ b/F4SDM42WebApi/F4SDM42WebApiController.cs @@ -5,7 +5,6 @@ using System.Linq; using System.Net; using System.Net.Http; using System.Reflection; -using System.Text; using System.Threading; using System.Threading.Tasks; @@ -65,7 +64,6 @@ namespace C4IT.F4SD { try { - //System.Diagnostics.Debugger.Launch(); lock (initLock) { if (IsInitialized || F4SDM42LogsWebApiController.IsInitialized) @@ -141,80 +139,7 @@ namespace C4IT.F4SD [Route("getTicketHistory"), HttpGet] public async Task> getTicketHistory(Guid objectId) { - try - { - return await _f4stHelperService.GetJournalEntries(objectId); - } - catch (MissingMethodException ex) - { - return CreateMissingMethodDiagnostics("getTicketHistory controller", objectId, ex); - } - } - - internal static List CreateMissingMethodDiagnostics(string stage, Guid objectId, MissingMethodException ex) - { - var details = BuildMissingMethodDiagnostic(stage, objectId, ex); - LogEntry(details, LogLevels.Warning); - - return new List - { - new cTicketJournalItem - { - ActivityObjectId = objectId, - CreatedBy = "C4ITF4SDM42WebApi", - CreationDate = DateTime.Now, - Header = "MissingMethodException diagnostic", - Description = details, - DescriptionHtml = WebUtility.HtmlEncode(details).Replace(Environment.NewLine, "
"), - IsVisibleForUser = false - } - }; - } - - private static string BuildMissingMethodDiagnostic(string stage, Guid objectId, MissingMethodException ex) - { - var builder = new StringBuilder(); - builder.AppendLine($"Stage: {stage}"); - builder.AppendLine($"ObjectId: {objectId}"); - builder.AppendLine(ex.ToString()); - builder.AppendLine("Loaded assemblies:"); - - var assemblyNames = new HashSet(StringComparer.OrdinalIgnoreCase) - { - "C4ITF4SDM42WebApi", - "C4ITF4SDM42WebApiHelper", - "Matrix42.Common", - "Matrix42.Common.Html", - "Matrix42.Contracts.Platform", - "Matrix42.Contracts.ServiceManagement", - "Matrix42.ServiceManager.BizLogic", - "Matrix42.BizLogic.Journal", - "Newtonsoft.Json", - "System.Net.Http.Formatting", - "update4u.SPS.DataLayer", - "update4u.SPS.Security" - }; - - foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies() - .Where(assembly => assemblyNames.Contains(assembly.GetName().Name)) - .OrderBy(assembly => assembly.GetName().Name)) - { - builder.AppendLine($"{assembly.GetName().Name}, Version={assembly.GetName().Version}, Location={GetAssemblyLocation(assembly)}"); - } - - return builder.ToString(); - } - - private static string GetAssemblyLocation(Assembly assembly) - { - try - { - return assembly.Location; - } - catch - { - return string.Empty; - } + return await _f4stHelperService.GetJournalEntries(objectId); } [Route("getTicketOverviewCounts"), HttpGet] diff --git a/docs/matrix42-26-1-extension-migration.md b/docs/matrix42-26-1-extension-migration.md index a3920e5..a32a941 100644 --- a/docs/matrix42-26-1-extension-migration.md +++ b/docs/matrix42-26-1-extension-migration.md @@ -65,23 +65,27 @@ Final bewaehrte Minimal-Konfig: Wichtig: Module nicht auf Vorrat laden. Jedes zusaetzliche Modul kann transitive Unity-Registrierungen erzwingen, die fuer den konkreten Webservice gar nicht benoetigt werden. -Problematische Module in dieser Migration: +Module duerfen nicht auf Vorrat geladen werden. Fuer Endpunkte, die Matrix42-Services nutzen, muessen die transitiven Abhaengigkeiten aber vollstaendig als Host-Module registriert werden. Fuer den finalen `IJournalService`-Pfad wurden unter anderem folgende Module benoetigt: - `Matrix42.Pandora.Persistence` - `Matrix42.Pandora.ServiceStore` - `Matrix42.Pandora.BizLogic` - `Matrix42.Pandora.Services` +- `Matrix42.MsTeamsNotification.BizLogic` +- `Matrix42.Integration.Aurora.General` +- `Matrix42.Integration.Aurora.Search.BizLogic` - `Matrix42.ServiceManager.BizLogic` - eigenes Webservice-Assembly als Host-Modul -Diese Module fuehrten unter anderem zu Fehlern wie: +Waehrend der Migration zeigten fehlende Module oder fehlende Sandbox-Host-Registrierungen unter anderem folgende Fehler: ```text IEntityDataService is an interface and cannot be constructed IUserProfileRepository is an interface and cannot be constructed IApiExplorer is an interface and cannot be constructed -Could not load type 'System.Web.Routing.RouteTable' IComplianceRuleManager is an interface and cannot be constructed +IRequestPropertiesProvider is an interface and cannot be constructed +IExternalSearchService is an interface and cannot be constructed ``` ## Controller-Konstruktion @@ -194,13 +198,14 @@ Danach kann der vorhandene ASQL-/Helper-Code mit der `Guid` weiterarbeiten. ## Journal-Service -`IJournalService` benoetigt zusaetzliche Matrix42-Service-Module. `Matrix42.ServiceManager.BizLogic` hat in dieser Migration wieder eine transitive `IComplianceRuleManager`-Abhaengigkeit erzeugt und darf deshalb nicht pauschal geladen werden. +`IJournalService` ist der bevorzugte Pfad fuer die Ticket-Historie. In 26.1 haengt der konkrete `JournalService` transitiv an Teams Notification, Pandora Services und Aurora Search. Diese Abhaengigkeiten muessen im Host vollstaendig geladen werden. Status: -- Ticket-Historie ueber `IJournalService` ist mit der Minimal-Host-Konfig nicht abgesichert. -- Fuer weitere Migrationen zuerst pruefen, ob ein kleineres Modul wie `Matrix42.ServiceManager.Services` reicht. -- Wenn nicht, Journal-Daten alternativ ueber DataLayer/ASQL lesen oder den Endpoint bewusst ausklammern. +- Ticket-Historie laeuft ueber `IJournalService`. +- Der Aufruf erfolgt per Reflection gegen die zur Laufzeit geladene `GetJournalList`-Signatur, damit 26.1 Patch-Level-Unterschiede keine direkte MethodRef brechen. +- Keine manuellen `JournalService`-Konstruktionen, Proxies, `JournalManager`-Fallbacks oder HTTP-Forwards verwenden. +- Wenn Unity ein weiteres Interface nicht aufloesen kann, zuerst in den Matrix42-DLLs nach einem `IDependencyRegistrator` fuer genau dieses Interface suchen und das zugehoerige BizLogic-/Services-Modul laden. ## Typische Fehlersymptome und Ursache @@ -214,7 +219,13 @@ Meistens direkte Konstruktor-Injection oder ein zu breit geladenes Host-Modul. Could not load type 'System.Web.Routing.RouteTable' ``` -Ein altes `System.Web`-/WebApi-Modul wurde in der Sandbox aktiviert. Nicht durch eigene `IApiExplorer`-Registrierung kompensieren, sondern die Ursache entfernen. +Ein ungeeignetes altes `System.Web`-/WebApi-Modul wurde in der Sandbox aktiviert. Ursache entfernen, statt weitere Abhaengigkeiten darum herum zu laden. + +```text +IApiExplorer is an interface and cannot be constructed +``` + +Der Matrix42-Sandbox-Host stellt nicht automatisch dieselbe WebApi-Explorer-Instanz wie der normale WebApi-Host bereit. Fuer den finalen Journal-Pfad registriert die Extension eine konkrete `System.Web.Http.Description.IApiExplorer`-Instanz per eigenem `IDependencyRegistrator`. ```json {"Version":"1.1","Content":{...},"StatusCode":200}