Nextended.Web
10.1.32
See the version list below for details.
dotnet add package Nextended.Web --version 10.1.32
NuGet\Install-Package Nextended.Web -Version 10.1.32
<PackageReference Include="Nextended.Web" Version="10.1.32" />
<PackageVersion Include="Nextended.Web" Version="10.1.32" />
<PackageReference Include="Nextended.Web" />
paket add Nextended.Web --version 10.1.32
#r "nuget: Nextended.Web, 10.1.32"
#:package Nextended.Web@10.1.32
#addin nuget:?package=Nextended.Web&version=10.1.32
#tool nuget:?package=Nextended.Web&version=10.1.32
![]()
Nextended.Web
ASP.NET Core utilities โ zero-config OData (AddODataAuto), composable IQueryable OData appliers, strongly typed controller URLs, streaming download helpers and a background executor that can replay a captured request.
๐ Documentation: English ยท Deutsch
Installation
dotnet add package Nextended.Web
Feature map
| Area | API |
|---|---|
| OData without a model builder | [ProvideAsEdm] on your entities, services.AddODataAuto(), mvcBuilder.AddODataAuto(model, routePrefix) |
| Composable OData appliers | ApplyOData, ApplyODataFilter, ApplyODataOrderBy, ApplyODataTop, ApplyODataSkip, ApplyODataSearch, ApplyODataExpandIncludes |
| Generic controller | GenericODataController<T> โ query, key lookup and facet building already wired |
| Faceted responses | FacetResourceSetSerializer emits facet metadata alongside an OData result set |
| Typed URLs | RequestHelper.UrlFor<TController>(โฆ), Action<TController>(โฆ), ActionLink<TController>(โฆ), RedirectToAction<TController>(โฆ) |
| Downloads | controller.DownloadDataAsync(...) for streams and writer callbacks, inline or attachment |
| Detached work | BackgroundExecutor โ run work after the response, in a fresh DI scope, optionally against a captured request |
| Uploads | IFormFile and IBrowserFile extensions (GetBytesAsync, GetReadableFileSize, โฆ) |
Quick start
OData that builds its own EDM model
Annotate the entities you want exposed and skip the ODataConventionModelBuilder boilerplate:
using Nextended.Core.Attributes;
[ProvideAsEdm("Products")]
public class Product
{
public Guid Id { get; set; }
public string Name { get; set; } = "";
public decimal Price { get; set; }
public Category? Category { get; set; }
}
// Base types can hand the registration down to every derived type:
[ProvideAsEdm(ProvideInherits = true)]
public abstract class EntityBase { public Guid Id { get; set; } }
// Program.cs
builder.Services.AddODataAuto(); // scans for [ProvideAsEdm]
builder.Services.AddControllers().AddODataAuto(
ProvidedAsEdm.GetEdmModel(), routePrefix: "odata");
ProvidedAsEdm collects the annotated types, wires inheritance between them, creates entity sets
for the annotated types and for navigation targets they reach, and caches the resulting model.
A controller you barely have to write
using Nextended.Web.Controller;
public class ProductsController(AppDbContext db) : GenericODataController<Product>
{
protected override IQueryable<Product> Queryable() => db.Products;
}
You get GET /odata/Products with $filter, $orderby, $top, $skip, $expand,
$search and facet building; and GET /odata/Products({key}). Override IdPropertyName when the
key is not called Id, and GetFacetBuilderOptions() to shape the facets.
Applying OData options to any IQueryable
Useful when the endpoint is not an OData route but you still want the query semantics:
using Nextended.Web.Extensions;
[HttpGet]
public async Task<IActionResult> Search(ODataQueryOptions<Product> options)
{
var query = db.Products
.ApplyODataFilter(options.Filter)
.ApplyODataSearch(options.Search)
.ApplyODataOrderBy(options.OrderBy)
.ApplyODataSkip(options.Skip)
.ApplyODataTop(options.Top);
return Ok(await query.ToListAsync());
}
ApplyODataExpandIncludes translates $expand into EF Core Include chains, so expansion does
not turn into N+1 queries.
Strongly typed URLs
using Nextended.Web.Helper;
var helper = new RequestHelper(urlHelper);
var url = helper.UrlFor<ProductsController>(c => c.Details(product.Id));
// refactor the action, the URL follows โ no magic strings
Streaming a download
[HttpGet("export")]
public Task Export(CancellationToken ct)
=> this.DownloadDataAsync(
writeResponseDataAction: stream => _exporter.WriteCsvAsync(stream, ct),
mimeType: "text/csv",
fileName: "products.csv",
inlineFile: false,
httpStatusCode: 200);
Nothing is buffered โ the callback writes straight to the response body.
Work that must outlive the response
public async Task<IActionResult> Import(IFormFile file, [FromServices] BackgroundExecutor executor)
{
// Captures the current request itself, so the detached scope can still see
// headers, user and route after the response has gone out.
await executor.ExecuteDetachedWithCapturedRequestAsync(
timeout: TimeSpan.FromMinutes(10),
action: async (services, ct) =>
{
var importer = services.GetRequiredService<IImporter>();
await importer.RunAsync(ct);
});
return Accepted();
}
Overloads take a list of IDisposable/IAsyncDisposable to release after the work, and
ExecuteDetachedAsync(snapshot, timeout, action) accepts a snapshot you captured yourself with
HttpContext.CaptureAsync(ct) โ for instance one taken before an earlier await.
var snapshot = await HttpContext.CaptureAsync(ct);
await executor.ExecuteDetachedAsync(snapshot, TimeSpan.FromMinutes(5), DoWorkAsync);
The action runs in a new DI scope, so the request's DbContext being disposed cannot break it.
Timeouts, exceptions and disposable cleanup are logged rather than thrown into the void, and
optional onSetup / onTeardown callbacks bracket the work.
Looking for permission-aware response shaping instead? That is Nextended.ResponseFilters.
Supported frameworks
net8.0net9.0net10.0
Dependencies
- Nextended.Core
- Nextended.EF
- Microsoft.AspNetCore.OData
The Nextended family
The other 17 packages in the suite:
Core libraries
- Nextended.Core โ Foundation library โ extension methods, custom types (Money, Date, BaseId, SuperType), class mapping, deep clone, encryption, hashing and the code-generation attributes.
- Nextended.Cache โ Expression-based caching โ automatic cache keys from method expressions, CacheProvider with condition-based invalidation, thread-safe AddOrGetExisting.
Data access
- Nextended.EF โ Entity Framework Core extensions โ graph loading (LoadGraphAsync, IncludeAll, MultiInclude), declarative include definitions, paging, dynamic sorting and bulk operations.
ASP.NET Core & web
- Nextended.Web โ ASP.NET Core utilities โ zero-config OData (AddODataAuto), composable IQueryable OData appliers, strongly typed controller URLs, streaming download helpers and a background executor that can replay a captured request. (this package)
- Nextended.ResponseFilters โ Fluent, provider-agnostic pipeline that redacts, masks, rounds, truncates, hashes, prunes and restructures response DTOs before serialization โ per request, per user, per permission.
- Nextended.ResponseFilters.AspNetCore โ ASP.NET Core adapter for Nextended.ResponseFilters โ registers the pipeline as a global IAsyncResultFilter and replays structural edits against the serialized JSON tree.
UI libraries
- Nextended.Blazor โ Blazor helpers โ IBrowserFile extensions (bytes, data URLs, downloads), a hierarchical model for browsing inside uploaded zip/tar/rar archives, MIME-type detection and component-parameter reflection.
- Nextended.UI โ WPF and Windows desktop helpers โ a global input-binding manager with hold/sequence matching, DirectInput and XInput gamepad readers, key-bind capture controls, converters, behaviours, markup extensions and runtime-defined PropertyGrid types.
Code generation & tooling
- Nextended.Imaging โ Image processing โ aspect-preserving resize, crop, colour replacement, brightness-based foreground picking, thumbnail generation, byte/data-URL conversion and MIME detection from magic bytes.
- Nextended.CodeGen โ Roslyn source generator โ DTOs and interfaces from your entities, strongly typed classes from JSON/XML, lookup tables from Excel, and documentation from source files.
.NET Aspire hosting
- Nextended.Aspire โ Conditional AppHost builder extensions โ WithReferenceIf / WaitForIf / WithExplicitStartIf, strongly typed environment variables from config objects, HTTPS dev-cert wiring, Docker guards, GitHub-source resources and npm app discovery.
- Nextended.Aspire.Hosting.Supabase โ The complete Supabase stack โ Postgres, Auth (GoTrue), REST, Realtime, Storage, Studio, Kong and Edge Functions โ as one composable Aspire resource.
- Nextended.Aspire.Hosting.N8n โ The n8n workflow-automation platform as an Aspire resource, with Postgres persistence, workflow import and a typed client for triggering workflows from .NET.
- Nextended.Aspire.Hosting.Grafana โ Grafana, Prometheus, Loki, Tempo, Promtail, cAdvisor, postgres_exporter and the OpenTelemetry Collector as composable resources with auto-provisioned datasources.
- Nextended.Aspire.Hosting.WebDataStudio โ WebDataStudio โ a browser database studio for PostgreSQL, MySQL, SQL Server, SQLite, Oracle, DuckDB, ClickHouse, MongoDB and Redis โ wired to the databases of your stack.
- Nextended.Aspire.Hosting.AspireUI โ AspireUI โ the visual AppHost builder โ as a resource inside your own Aspire stack, with an optional pre-seeded admin user and a starter stack built from your project paths.
- Nextended.Aspire.Hosting.LocalAI โ Self-hosted, OpenAI-compatible multimodal AI โ image generation, text-to-speech, speech-to-text and video โ with gallery model management, GPU support and Open WebUI.
- Nextended.Aspire.Hosting.Php โ Run PHP endpoints inside your Aspire stack โ a docroot folder or a single router script served by PHP's built-in web server, with php.ini settings as fluent options.
Links
- ๐ฆ NuGet package
- ๐ Documentation โ English
- ๐ Dokumentation โ Deutsch
- ๐ Documentation portal
- ๐งโ๐ป Source code
- ๐ Report an issue
License
GPL-3.0-or-later โ see LICENSE.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Microsoft.AspNetCore.OData (>= 9.4.1)
- Newtonsoft.Json (>= 13.0.4)
- Nextended.Core (>= 10.1.32)
- Nextended.EF (>= 10.1.32)
- System.Data.DataSetExtensions (>= 4.5.0)
-
net8.0
- Microsoft.AspNetCore.OData (>= 9.4.1)
- Newtonsoft.Json (>= 13.0.4)
- Nextended.Core (>= 10.1.32)
- Nextended.EF (>= 10.1.32)
-
net9.0
- Microsoft.AspNetCore.OData (>= 9.4.1)
- Newtonsoft.Json (>= 13.0.4)
- Nextended.Core (>= 10.1.32)
- Nextended.EF (>= 10.1.32)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 10.1.34 | 51 | 8/27/2026 |
| 10.1.33 | 82 | 8/24/2026 |
| 10.1.32 | 89 | 8/20/2026 |
| 10.1.31 | 88 | 8/19/2026 |
| 10.1.30 | 105 | 8/19/2026 |
| 10.1.21 | 120 | 7/30/2026 |
| 10.1.20 | 110 | 7/26/2026 |
| 10.1.19 | 111 | 7/23/2026 |
| 10.1.18 | 101 | 7/22/2026 |
| 10.1.17 | 100 | 7/21/2026 |
| 10.1.16 | 106 | 7/21/2026 |
| 10.1.15 | 108 | 7/21/2026 |
| 10.1.14 | 116 | 7/16/2026 |
| 10.1.13 | 116 | 7/12/2026 |
| 10.1.12 | 108 | 7/12/2026 |
| 10.1.11 | 126 | 7/6/2026 |
| 10.1.10 | 125 | 6/16/2026 |
| 10.1.9 | 120 | 5/29/2026 |
| 10.1.8 | 127 | 5/19/2026 |
| 10.1.7 | 122 | 5/16/2026 |