Skip to content

Release 26.3.0

Choose a tag to compare

@vladimir-litvinchik vladimir-litvinchik released this 04 Mar 18:06
· 16 commits to main since this release

This release introduces Docker image support, new extensibility APIs, distributed caching, Azure AD authentication, startup validation, and numerous bug fixes and improvements across the library.

🛠️ Changes

Docker Image Support

A pre-built Docker image is now published to Docker Hub and GitHub Container Registry, enabling zero-setup deployment:

docker run -p 8080:8080 -v ./documents:/app/Files groupdocs/viewer-ui:latest

All settings are configurable via environment variables (VIEWER_TYPE, VIEWER_STORAGE_PATH, VIEWER_CACHE_PATH, etc.). Includes health check endpoint at /health and docker-compose example.

New Extensibility APIs

  • AddCustomScript(path) — Inject custom JavaScript into the viewer UI page
  • ReadFileStreamAsync on IFileStorage — Stream-based file reading to avoid loading entire files into memory
  • RemoveAsync on IFileCache — Cache invalidation API for all cache providers (Local, InMemory, Distributed)
  • Comprehensive XML documentation and README examples for IPageFormatter, IFileTypeResolver, ISearchTermResolver, IFileNameResolver, and IErrorMessageProvider

Distributed Cache Provider

New GroupDocs.Viewer.UI.Api.Distributed.Cache package wrapping IDistributedCache, enabling Redis, SQL Server, or NCache as cache backends:

builder.Services.AddControllers()
    .AddGroupDocsViewerSelfHostApi()
    .AddDistributedCache();

Azure AD Authentication

Azure Blob Storage now supports TokenCredential (e.g., DefaultAzureCredential) and connection string authentication in addition to account name/key:

.AddAzureBlobStorage(options =>
{
    options.AccountName = "myaccount";
    options.ContainerName = "documents";
    options.TokenCredential = new DefaultAzureCredential();
})

Startup Validation

Two new IHostedService validators warn at startup about common misconfigurations:

  • ConfigurationValidator — Detects RenderingMode/ViewerType mismatch
  • ServiceRegistrationValidator — Warns when IFileStorage is not registered

Browser-Side Response Caching

New ResponseCacheDurationSeconds config property adds Cache-Control headers to GET endpoints (/get-page, /get-thumb, /get-pdf, /get-resource).

Configuration Improvements

  • appsettings.json binding now works for SelfHost API config properties (LicensePath, ViewerType)
  • Configurable SizeLimit for InMemoryCache to cap memory usage
  • Root endpoint (/) support for the viewer UI

Async and Cancellation Improvements

  • CancellationToken propagated through IViewer, IFileStorage, and IFileCache interfaces
  • Thread.Sleep replaced with await Task.Delay in async paths

Version Scheme

Switched to company versioning scheme (YY.M.0). This release is 26.3.0 (March 2026).

🐛 Bug Fixes

  • Fix PngViewer using JpgViewOptions for ViewInfo
  • Fix thumb URL using PageExtension instead of ThumbExtension
  • Fix duplicate FontsToExclude assignment
  • Fix broken URL in Cloud API sample
  • Fix MemoryStream not disposed in ReadFileFromRequest
  • Fix duplicate UserSecretsId between samples
  • Fix missing System.Drawing.EnableUnixSupport in SelfHost samples
  • Fix indexer setter using Insert instead of assignment in Pages and Thumbs
  • Fix JpgPage and PngPage SetContent encoding bug
  • Fix network roundtrip on every operation when using Azure Blob Storage
  • Add BucketName validation to AwsS3FileStorage constructor

🔧 Infrastructure

  • Update GitHub Actions to v4
  • Target Dockerfiles and samples to .NET 8.0
  • Update .NET SDK prerequisite to 8.0
  • Remove stage publishing workflow
  • Fix typos in README files

📦 Packages

Thirteen NuGet packages available including the new GroupDocs.Viewer.UI.Api.Distributed.Cache.


Thank you for using GroupDocs.Viewer.UI! If you encounter any issues or have suggestions, please don't hesitate to provide feedback here on GitHub or at our Free Support Forum.