chore: clean up journal migration diagnostics

This commit is contained in:
Meik
2026-07-01 09:34:00 +02:00
parent e9be853362
commit 3ef49054ca
4 changed files with 21 additions and 89 deletions

View File

@@ -13,7 +13,7 @@
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
<M42ExtensionId>6673a25d-33d6-4072-91d9-abed4be1a966</M42ExtensionId>
<M42AssemblyPattern>C4ITF4SD*.*</M42AssemblyPattern>
<M42PackageVersion>1.4.0.35</M42PackageVersion>
<M42PackageVersion>1.4.0.36</M42PackageVersion>
<M42BuildPackage>true</M42BuildPackage>
</PropertyGroup>

View File

@@ -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);

View File

@@ -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)
@@ -140,82 +138,9 @@ namespace C4IT.F4SD
[Route("getTicketHistory"), HttpGet]
public async Task<List<cTicketJournalItem>> getTicketHistory(Guid objectId)
{
try
{
return await _f4stHelperService.GetJournalEntries(objectId);
}
catch (MissingMethodException ex)
{
return CreateMissingMethodDiagnostics("getTicketHistory controller", objectId, ex);
}
}
internal static List<cTicketJournalItem> CreateMissingMethodDiagnostics(string stage, Guid objectId, MissingMethodException ex)
{
var details = BuildMissingMethodDiagnostic(stage, objectId, ex);
LogEntry(details, LogLevels.Warning);
return new List<cTicketJournalItem>
{
new cTicketJournalItem
{
ActivityObjectId = objectId,
CreatedBy = "C4ITF4SDM42WebApi",
CreationDate = DateTime.Now,
Header = "MissingMethodException diagnostic",
Description = details,
DescriptionHtml = WebUtility.HtmlEncode(details).Replace(Environment.NewLine, "<br />"),
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<string>(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;
}
}
[Route("getTicketOverviewCounts"), HttpGet]
public async Task<F4SDHelperService.TicketOverviewCountsResult> getTicketOverviewCounts(

View File

@@ -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}