chore: clean up journal migration diagnostics
This commit is contained in:
@@ -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>
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user