Releases: GleamTech/DocumentUltimate
DocumentUltimate v8.1.0
Version 8.1.0 - April 24, 2026
-
Fixed: The fix back in
Version 7.5.8 - April 11, 2025for parsingRefererhttp header was not sufficient.
This warning was occasionally recorded in server's Event Log:
This operation is not supported for a relative URI. -
Improved: Ensured stability of cookieless session feature for iframe with a cross-domain URL.
This feature (GleamTechWebConfiguration.AutoCookielessSessionEnabled) was first added inVersion 5.8.1 - November 23, 2020. -
Added:
GleamTechWebConfiguration.PathBaseForSessionEnabledproperty that specifies whether
to use request PathBase (correct cased application virtual path) for session cookie and not default path/.
The default value istrueso it's active by default.The problem with ASP.NET Core session is, if for example you have 2 app instances on the same domain:
- First visit to
/MyApp1, the session cookie is created and set (with cookie path/). - Then visit to
/MyApp2, the session cookie exists (with cookie path/)
but this app cannot decrypt it because their key ring is not shared.
This causes unnecessaryError unprotecting the session cookiewarnings in server's Event Log.
A new session cookie is still created but the problem is the logging inCookieProtection.Unprotect()on exception.
In ASP.NET classic, session cookie path also defaults to
/and not to the application virtual path,
though this does not cause a warning/error, but you get a new empty session with the existing session cookie.So, the best solution is to use correct cased application virtual path as session cookie path when available
and not the default path/, to isolate session of all app instances on the same domain, for example:ApplicationVirtualPath: /DocumentUltimate/AspNetWebFormsCS ? (IIS canonical casing) Request.Path: /documentultimate/aspNetWebFormsCS/Page.aspx ? (actual request casing) PathBase (correct cased): /documentultimate/aspNetWebFormsCSCookie paths are case-sensitive so when not using the default path
/,
we ensure PathBase used for cookie path is correct cased (cased same as the one user typed in address bar).However, if you want to share the session cookie across all app instances on the same domain,
set this tofalse(default ASP.NET Session behavior). - First visit to
-
Improved: Normally, to have Session cookie work properly for an ASP.NET Core app hosted in IIS,
"Load User Profile" property should be set to true for application pool used for that app.
However for convenience, we will now useKeyssubfolder underGleamTechConfiguration.TemporaryFolder
by default inAddGleamTech()ifKeyManagementOptions.XmlRepositoryis not explicitly set
and if app is not hosted in Azure Apps.
This is because if keys can not be persisted to a writable directory, they are stored in-memory
and when the process shuts down (or application pool is recycled), all generated keys are lost.
As a result, these unnecessary warnings are recorded in server's Event Log:No XML encryptor configured. Key {guid} may be persisted to storage in unencrypted form. Neither user profile nor HKLM registry available. Using an ephemeral key repository. Protected data will be unavailable when application exits. Using an in-memory repository. Keys will not be persisted to storage. The antiforgery token could not be decrypted. Error unprotecting the session cookie. The key {guid} was not found in the key ring.This way even if "Load User Profile" property is set to false, we will fix default ASP.NET behavior
and avoid warnings spamming server's Event Log.
Included example projects:
- ASP.NET Core (C#) - Visual Studio 2019+
- ASP.NET Core on .NET Framework (C#)- Visual Studio 2017+
- ASP.NET MVC (C#) - Visual Studio 2015+
- ASP.NET MVC (VB) - Visual Studio 2015+
- ASP.NET WebForms (C#) - Visual Studio 2015+
- ASP.NET WebForms (VB) - Visual Studio 2015+
DocumentUltimate v8.0.0
Version 8.0.0 - April 6, 2026
-
Changed: License keys are changed so please go to https://www.gleamtech.com/upgrade and acquire a new license
key if you want to use this version (or higher). If your one year maintenance has not ended, you will receive a
new free license key on the same page. -
Changed: AssemblyVersion is changed so recompile your project against the new DLLs (drop in to bin folder will not work).
-
Improved: Stability and performance of Portable and Dicom formats.
Included example projects:
- ASP.NET Core (C#) - Visual Studio 2019+
- ASP.NET Core on .NET Framework (C#)- Visual Studio 2017+
- ASP.NET MVC (C#) - Visual Studio 2015+
- ASP.NET MVC (VB) - Visual Studio 2015+
- ASP.NET WebForms (C#) - Visual Studio 2015+
- ASP.NET WebForms (VB) - Visual Studio 2015+
DocumentUltimate v7.8.7
Version 7.8.7 - December 23, 2025
-
Fixed: Attempt to fix bfcache (back-forward cache) issues on iOS Safari (and others) and apps using WebView.
Reload iframe (recreate iframe) to prevent possible issues when restoring from bfcache. -
Fixed: Loading bar position was not accurate on mobile mode (was shown in the middle of the toolbar)
or whentoolbarAtBottomoption was used. -
Improved: When
DebugModeproperty set to true, do not display alert dialog
for "same and repeating" global unhandled errors and unhandled promise rejections in browser window.
For example "ResizeObserver loop..." errors can spam the alert dialog and make page unusable, so
display error only if it's changed.
Included example projects:
- ASP.NET Core (C#) - Visual Studio 2019+
- ASP.NET Core on .NET Framework (C#)- Visual Studio 2017+
- ASP.NET MVC (C#) - Visual Studio 2015+
- ASP.NET MVC (VB) - Visual Studio 2015+
- ASP.NET WebForms (C#) - Visual Studio 2015+
- ASP.NET WebForms (VB) - Visual Studio 2015+
DocumentUltimate v7.8.5
Version 7.8.5 - December 18, 2025
-
Improved: Updated PDF.js library to 5.4.449 for stability and performance.
-
Fixed: Error when DocumentViewer is put into a cross-domain iframe:
Uncaught (in promise) SecurityError: Failed to read a named property 'matchMedia' from 'Window'
Also avoidBlocked autofocusing on a <button> element in a cross-origin subframe.browser warning
by not usingautofocusattribute. -
Fixed: Comments sidebar and signature menus should use the same font-family and
font-size should be relative to the UI e.g. when using large UI sizing. -
Fixed: When converting/viewing Word Processing formats show Header/Footer even if page content is empty.
-
Added: New permission
DocumentViewerPermissions.RunScriptswhich is included in default permissionDocumentViewerPermissions.All.
For security purpose, you can now disable execution of active content (JavaScript) by PDF files. -
Fixed:
CacheTrim.logwas being deleted too often as file creation date was not reset and thus it was considered expired.
Included example projects:
- ASP.NET Core (C#) - Visual Studio 2019+
- ASP.NET Core on .NET Framework (C#)- Visual Studio 2017+
- ASP.NET MVC (C#) - Visual Studio 2015+
- ASP.NET MVC (VB) - Visual Studio 2015+
- ASP.NET WebForms (C#) - Visual Studio 2015+
- ASP.NET WebForms (VB) - Visual Studio 2015+
DocumentUltimate v7.8.0
Version 7.8.0 - October 20, 2025
-
Improved: Updated PDF.js library to 5.4.296 for stability and performance.
-
Added: Ability to add, edit, view comments in the document.
New permissionDocumentViewerPermissions.EditCommentswhich is included in default permissionDocumentViewerPermissions.All. -
Improved: Ensure toolbar menus are clamped to the viewer window
and repositioned when viewer window is scrolled, resized or menu is resized. -
Improved: Ensure top toolbar menus are always over vertical toolbar menus.
-
Fixed: When creating multiple instances of viewer in the same page
webviewerloadedevent was being registered multiple times thus causing errors.
This may be the root cause of unreplicated error:The `container` must be absolutely positioned..
The viewer id was being unnecessarily incremented even if it did not exist in the document.
Track viewer id internally as user may re-assign the window global variable. -
Improved: Set minimum value limits for
DocumentCachesettings to prevent unnecessaryDocument cache info is not found
errors due to user misconfiguration (e.g. thinking they can disable cache by setting zero
or low values but cache is required for correct operation of DocumentViewer).
The error happened due to very early trimming of the cache especially when multiple users.MaxAge-> The minimum value is 10 minutes.WaitTimeout-> The minimum value is 2 minutes.AutoTrimInterval-> The minimum value is 5 minutes. The default value is now changed from 20 minutes to 15 minutes
mainly because IIS AppPool default idle-timeout setting is 20 minutes so we ensure the auto-trim is run before app shutdown.
-
Improved: Overwrite existing
CacheTrim.logif it was created beforeDocumentCache.MaxAgeto avoid very large log files.
Included example projects:
- ASP.NET Core (C#) - Visual Studio 2019+
- ASP.NET Core on .NET Framework (C#)- Visual Studio 2017+
- ASP.NET MVC (C#) - Visual Studio 2015+
- ASP.NET MVC (VB) - Visual Studio 2015+
- ASP.NET WebForms (C#) - Visual Studio 2015+
- ASP.NET WebForms (VB) - Visual Studio 2015+
DocumentUltimate v7.7.6
Version 7.7.6 - October 2, 2025
-
Improved:
AuthenticatedUser.WindowsandAuthenticatedUser.Claimsused forPhysicalLocationwill now also work on
ASP.NET Core (previously only worked on ASP.NET Classic).
Also the enum membersAuthenticatedUser.WindowsandAuthenticatedUser.Claimsare made obsolete.
UseAuthenticatedUser.WebServerandAuthenticatedUser.ClaimsUpninstead.
These new enum member names are more explanatory for their purpose. -
Improved: Prevent log file name conflicts when multiple Apps sharing App_Data
For example try file namesGleamTech.log,GleamTech-AppName.log,GleamTech-AppName-z0yxh40r.log.
Also provide environment details (app name, location, os) inGleamTech.logjust likeAssemblyResolver.log
when initializingGleamTechConfiguration.
Included example projects:
- ASP.NET Core (C#) - Visual Studio 2019+
- ASP.NET Core on .NET Framework (C#)- Visual Studio 2017+
- ASP.NET MVC (C#) - Visual Studio 2015+
- ASP.NET MVC (VB) - Visual Studio 2015+
- ASP.NET WebForms (C#) - Visual Studio 2015+
- ASP.NET WebForms (VB) - Visual Studio 2015+
DocumentUltimate v7.7.5
Version 7.7.5 - September 26, 2025
-
Improved: The default value for
GleamTechConfiguration.TemporaryFolderwill now be[AppData Temporary Folder]
if current user has read/write access, if not it will be[System Temporary Folder].This change is done so that developer is only concerned about write permissions to
[AppData Temporary Folder]
when publishing to production and not system temporary folders such asC:\Windows\Temp.
This way, everything will be on the table i.e. all generated files (AssemblyResolver files, cache files, log files) will be in a single place.
Files from old system temporary folder will be migrated/moved to this new location on application startup (if has write access).[AppData Temporary Folder]can be different for different environments:- For ASP.NET Core apps, the resolved result of
~/App_Data:[AppBase]\wwwroot\App_Data\Temporary
- For ASP.NET Classic apps, the resolved result of
~/App_Data:[AppBase]\App_Data\Temporary
- For Console or other non-web apps:
[AppBase]\AppData\Temporary
[System Temporary Folder]can be different for different environments:- For ASP.NET Core apps, the result of
Path.GetTempPath()which
depends on "TMP", "TEMP" and "USERPROFILE" environment variables:%WINDIR%\Temp\GleamTech\[AppName]-[AppHash]%LOCALAPPDATA%\Temp\GleamTech\[AppName]-[AppHash]
(if "Load User Profile" is enabled for AppPool in IIS)
- For ASP.NET Classic apps:
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\[AppName]\[AppHash]\GleamTech%WINDIR%\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\[AppName]\[AppHash]\GleamTech
(if 32-bit AppPool)%LOCALAPPDATA%\Temp\Temporary ASP.NET Files\vs\[AppHash]\GleamTech
(when debugging in Visual Studio)
- For Console or other non-web apps, the result of
Path.GetTempPath()which
depends on "TMP", "TEMP" and "USERPROFILE" environment variables:%LOCALAPPDATA%\Temp\GleamTech\[AppName]-[AppHash]%WINDIR%\Temp\GleamTech\[AppName]-[AppHash]
- For apps running on unix-like platforms:
/tmp/GleamTech/[AppName]-[AppHash]
- For ASP.NET Core apps, the resolved result of
-
Improved:
ImpersonationContextis improved to support multi-threads and async threads.
EnsuredImpersonationInfoandLogonCredentialdo not lose access tokens (re-cache when necessary). -
Improved:
TemporaryFolder,FileCacheandDbProviderwill now do two tries for access, if first one fails,
will try again by reverting possible impersonation. -
Changed: Removed legacy
GleamTechConfiguration.AlphaFileSystemEnabledproperty.
Included example projects:
- ASP.NET Core (C#) - Visual Studio 2019+
- ASP.NET Core on .NET Framework (C#)- Visual Studio 2017+
- ASP.NET MVC (C#) - Visual Studio 2015+
- ASP.NET MVC (VB) - Visual Studio 2015+
- ASP.NET WebForms (C#) - Visual Studio 2015+
- ASP.NET WebForms (VB) - Visual Studio 2015+
DocumentUltimate v7.7.2
Version 7.7.2 - September 10, 2025
-
Improved: Updated PDF.js library to 5.4.149 for stability and performance.
-
Improved: Created toggle-able sub-menus for scrollMode and spreadMode buttons
to reduce crowdedness of the vertical toolbar. -
Improved: Stability of Loader and some page events.
Included example projects:
- ASP.NET Core (C#) - Visual Studio 2019+
- ASP.NET Core on .NET Framework (C#)- Visual Studio 2017+
- ASP.NET MVC (C#) - Visual Studio 2015+
- ASP.NET MVC (VB) - Visual Studio 2015+
- ASP.NET WebForms (C#) - Visual Studio 2015+
- ASP.NET WebForms (VB) - Visual Studio 2015+
DocumentUltimate v7.7.1
Version 7.7.1 - September 1, 2025
-
Fixed: Enlarged toolbar height in older browsers like before Chrome 115 (2023).
-
Fixed: Wrong theme colors in older browsers (before Chrome 123 and iOS Safari 17.5).
-
Improved: Toolbar and Find dialog size on phones.
Zoom buttons and selection are unnecessary on phones (user can pinch to zoom),
especially for mobile mode (large UI sizing) so hide them to fix toolbar overflowing.
Fixed Find dialog size on phones, the dialog contents should wrap. -
Improved: Made Loader responsive so that components can be viewed better on phones and tablets
(set width to 100 percent automatically on non-desktop devices). -
Improved: Updated demo pages to use full viewport on non-desktop browser sizes (i.e. phone and tablet sizes).
Included example projects:
- ASP.NET Core (C#) - Visual Studio 2019+
- ASP.NET Core on .NET Framework (C#)- Visual Studio 2017+
- ASP.NET MVC (C#) - Visual Studio 2015+
- ASP.NET MVC (VB) - Visual Studio 2015+
- ASP.NET WebForms (C#) - Visual Studio 2015+
- ASP.NET WebForms (VB) - Visual Studio 2015+
DocumentUltimate v7.7.0
Version 7.7.0 - August 26, 2025
-
Improved: Updated PDF.js library to 5.4.54 for stability and performance.
-
Fixed: Avoid
The `container` must be absolutely positioned.error in revisited Viewer pages on iOS Safari. -
Improved: Scrollbar colors are beautified and made consistent for all themes.
-
Fixed: Setting a specific theme like "classic-light" or "classic-dark" was no longer overriding user OS preference.
-
Improved: Stability and performance of Portable formats.
-
Improved: For text watermarks, if the text has any CJK characters (Chinese, Japanese, Korean) and no font is specified
then by default use a CJK font instead of Helvetica font, so that the text watermark is displayed correctly, out of the box. -
Improved: When using
DocumentViewerMatchOptions.MatchAnyWord, now the quotation marks can be used to specify phrases
inside a query that is set viaDocumentViewerSearchOptions.Term.
For example;red "four wheels" petrolwill matchredorfour wheelsorpetrolorred four wheels petrolred ""four wheels"" petrolwill matchredor"four wheels"orpetrolorred "four wheels" petrol
documentViewer.SearchOptions.Term = "red \"four wheels\" petrol"; documentViewer.SearchOptions.MatchOptions = MatchOptions.MatchAnyWord; //If you have an array of phrases, you can surround them with quotation marks //and then join them with spaces to form a query: var phrases = new[] { "red", "four wheels", "petrol" }; var query = string.Join(" ", phrases.Select(p => $"\"{p}\"")); documentViewer.SearchOptions.Term = query; documentViewer.SearchOptions.MatchOptions = MatchOptions.MatchAnyWord;
Note that two consecutive quotation marks
""can be used to escape, i.e. to search for a quotation mark literally as".
The same feature can also be used in the Viewer's Find dialog.
Included example projects:
- ASP.NET Core (C#) - Visual Studio 2019+
- ASP.NET Core on .NET Framework (C#)- Visual Studio 2017+
- ASP.NET MVC (C#) - Visual Studio 2015+
- ASP.NET MVC (VB) - Visual Studio 2015+
- ASP.NET WebForms (C#) - Visual Studio 2015+
- ASP.NET WebForms (VB) - Visual Studio 2015+