ldap_external is a private static field mutated from an instance constructor on every request, and the static method IsAuthorizedExternal reads it; concurrent requests share and overwrite the same field |
SecurityService |
Under concurrent load, one request's resolved external LDAP host can be overwritten by another request's before the first request's authorization check runs — a cross-request shared-state hazard |
Make the external LDAP host resolution a per-instance (or per-call, passed as a parameter) value rather than a mutable static field |
The six [ServiceContract] interfaces (IFileService, IPreferenceService, IWebContextService, IImagingService, IFaxService, ISecurityService) live outside this repository in SAIF.Services.WCF.Contracts, arriving only transitively via SAIF.Framework.Core with no direct reference and no version pin |
All six service classes |
The operation surface this host publishes can change without any corresponding change appearing in this repository's history |
Add a direct, version-pinned reference to SAIF.Services.WCF.Contracts if it is intended to be a first-class dependency of this host |
SAIFConnection.dll 1.8.5.0 is vendored by <HintPath> outside packages\, with <SpecificVersion>False</SpecificVersion>, is not a NuGet package, and is not in packages.config — and no host source file references its types |
WCF.csproj (src/WCF/Libs/SAIF/SAIFConnection.dll) |
This binary cannot be restored, upgraded, or audited through the package pipeline; a rebuild depends on a file checked into the repository whose provenance is not tracked by any package manifest |
Confirm whether this assembly is actually required at run time; remove the reference if it is not, or migrate it to a package if it is |
ImagingService is registered under the route name Imaging in both this host and SAIF.Services.WCF32.Host, but the two are different classes implementing different contracts (SAIF.Services.WCF.Contracts.IImagingService here vs. SAIF.Services.WCF.Imaging.WCF32.IImagingService there) on different platform targets (x64 vs. x86) |
SAIF.Services.WCF.Services.ImagingService; also SAIF.Services.WCF32.Host (not documented — no pipeline reference, no .nuspec reference) |
A change intended for one imaging surface can be mistaken for a change to the other; the two implementations can drift silently since neither references the other |
Rename one of the two routes to remove the ambiguity, or document the split explicitly at the point of registration |
There is no dependency-injection container in this host; every collaborator across all six services is constructed with new against a concrete class inside a parameterless constructor or a per-call method, and Autofac 3.5.2 is referenced in packages.config but unused by any host source file |
All six service classes |
Collaborators cannot be substituted for testing or reconfigured without changing source; the unused Autofac reference adds confusion about whether a container is actually in use |
Either remove the unused Autofac reference, or adopt it as the composition root if dependency substitution is needed |
ImagingService.ThrowTimeoutException(int) constructs a FaultException with FaultCode("RequestTimeout") but has no call site anywhere in the host — it is unreachable dead code |
SAIF.Services.WCF.Services.ImagingService |
The method suggests a timeout-fault contract exists for callers when none is actually ever raised, which can mislead a reader of the code into believing timeout handling exists on this path |
Remove the dead method, or wire it into an actual timeout-detection path if one is intended |
packages.config is used exclusively for package management across the whole project, with no PackageReference migration path |
WCF.csproj, packages.config |
The project cannot take advantage of PackageReference features (transitive restore, lockfiles, floating versions) and remains on the older, more error-prone package-management model |
Plan a migration to PackageReference when the host is next substantially touched |
ErrorLogErrorHandler.HandleError dereferences error.TargetSite.DeclaringType with no null guard; TargetSite is null for some exception shapes |
ErrorLogErrorHandler |
An exception whose TargetSite is null could cause the logging call itself to throw a secondary NullReferenceException inside the error handler, potentially masking the original failure's log entry |
Add a null check around error.TargetSite before dereferencing .DeclaringType |