Skip to content

Latest commit

 

History

History
1026 lines (539 loc) · 24.9 KB

File metadata and controls

1026 lines (539 loc) · 24.9 KB

RELEASE

Notes :

  • it does not strictly follow the semver convention.
  • no technical debt : code that's need to be refactored/broken, will be.
  • when something breaks, it's documented and a migration guide is provided.
  • no long-term support or backports for major versions, just stick to the latest update.
  • found a bug or way to optimize, feel free to submit a patch.

Roadmap / (2026-??-??)

  • docker template
  • dotnet template
  • captcha module
  • HTTP/3 quic

v26.0.0 - (2026-04-26)

After months of rewrite, testing, release candidates, breaking changes, documentation work, and a few painful but necessary design decisions, SimpleW v26 is finally ready.

This release is not just an update. It is a complete rewrite of SimpleW.

The old version was built on top of NetCoreServer, mostly through overrides and custom extensions. It worked, it was fast, and it served the project well for a long time. But over time, SimpleW needed its own HTTP architecture: something simpler, cleaner, easier to extend, and easier to maintain.

So v26 was rebuilt from scratch.

The result is a smaller and more explicit core, still focused on performance, but now designed around SimpleW's own model: middleware, modules, addons, a cleaner request/response lifecycle, better routing, better observability, stronger request protection, and a much better foundation for real applications.

Highlights

  • Complete rewrite from scratch
  • New middleware and module architecture
  • New addon ecosystem
  • Cleaner routing, including host-based routing
  • Sync and async handlers with request cancellation
  • Better static files support with cache, Last-Modified, ETag and Content-Range
  • WebSocket and SSE modules with room-based broadcasting
  • New Principal / Identity authentication model
  • Logging, traces, metrics and enrichment per server instance
  • Better malformed request protection
  • Easier extensibility with custom router and engine support
  • Updated documentation and migration guide

Several addons are already available, including BasicAuth, Jwt, OpenID, Firewall, Hosting, Razor, Swagger, LetsEncrypt, Templates, Serilog, Log4net and Dependency Injection.

SimpleW v26 is now minimal by default, fast by design, and much easier to compose for production applications.

Thank you to everyone who followed the rewrite, tested the prereleases, read the documentation, reported issues, or simply waited patiently.

Now the real fun begins.

breakingChange

There is a complete migration guide.

feature / comparison

Feature / Aspect SimpleW v16 (old) SimpleW v26 (new)
NET runtime NET8 NET8 but should consider NET9/NET10 for better perfs and RAM usage under heavy load (e.g: NET8 400Mo, NET9 100Mo, NET10 70Mo)
Core architecture ⚠️ (tied to NetCoreServer) ✅ from scratch (custom, simple, clean)
Code readability ⚠️
Overall design philosophy ⚠️ wrapper ✅ minimal, custom, fast
Long-term maintainability ⚠️ harder ✅ much easier
Performance ✅ (very high) ✅ (very high)
Middleware
Modules
Extensibility ⚠️ (callback, subclass) ✅ middleware, module, callback, subclass
Custom Router / Engine UseRouter(), UseEngine()
Response Builder ✅(status, contentType, headers, body, cookies) ✅ (status, contentType, contentLength, headers, body, cookies, compression)
Result Handler ✅ configurable response pipeline
Handler (Expression Tree) ✅ sync ❌async ✅ sync ✅ async + RequestAborted
Handler metadata ✅ metadata attributes for middleware and addons
Routing ✅ (minimal, attribute, querystring, regexp, path, wildcard) ✅ (minimal, attribute, querystring, path, wildcard, host)
Minimal API
Controllers
Dependency Injection ✅ (using the Dependency Injection addon)
SSL / HTTPS ✅ (SslContext) ✅ (SslContext, mutual authentication)
WebSocket ✅ (full broadcast) ✅ (smart broadcast using "rooms")
Server-Sent Events (SSE) ✅ (smart broadcast using "rooms")
Unix socket
Static files ✅ (Cache, FileWatcher) ✅ (Cache, FileWatcher, Last-Modified, Etag)
Cross-Origin Resource Sharing (CORS)
Body parsing (JSON)
Body parsing (form-urlencoded)
Body parsing (multipart/form-data) ✅ + streaming parser
Bag ✅ (share data between middleware)
Auth ⚠️ custom IWebUser ✅ Principal / Identity
Custom JSON engine
HTTP pipelining
Content Range
Idle Timeout
Request Protection ✅(malformed)
Observability ✅ (traces) & global to all processes ✅ (traces, metrics, enrich) per SimpleWServer instance
Logging ✅ sinks, levels, lazy logging, bridges
Listener reload ReloadListenerAsync()
Documentation simplew.net
Tests ✅ (more tests)
Support Discord
Addons ✅ BasicAuth, Chaos, Firewall, Hosting, Jwt, Latency, Log4net, OpenID, Razor, Swagger, LetsEncrypt, Templates, Serilog, DependencyInjection, Newtonsoft

v16.1.0 / (2025-11-02)

Maintenance, rewritten some parts of the code and documentation for easier use.

breakingChange

  • moved the Controller.MakeAccessResponse() to HttpResponse.MakeAccessResponse() (see example)

feature

  • feature: add headers parameter to HttpResponse.MakeResponse() (#71)
  • feature: add new HttpResponse.MakeResponse(object content) methods (#75)
  • chore: inject Session in Response (#73)
  • feature(test): add unit test for custom headers and compress types (#80)
  • feature: avoid PerformServerUpgrade there is no websocket route defined (#79)
  • refactor: move MakeAccessResponse() into HttpResponse class (#76)

fix

  • fix(NetCoreServer): WebSocket.PerformServerUpgrade() set MakeErrorResponse() when Connection: "keep-alive" (#77)

v16.0.0 / (2025-10-21)

Major release, including extensive rewrites and significant performance improvements (+9% req/s)

breakingChange

  • removed the Newtonsoft.Json dependency from the SimpleW nuget package. The default json engine is now System.Text.Json. To switch back, set Newtonsoft as the JsonEngine and install the a new SimpleW.Newtonsoft nuget package to (see example)
  • "X-*" headers are not trusted by default. To allow them, set the TrustXHeaders server property to true (see example).
  • in Controller, all Make*Response() methods have been replaced by Response.Make*Response() (see example)
  • removed Controller.SendResponseAsync()
  • the cache in AddStaticContent() is now disabled by default. Set the timeout parameter to enable caching (see example)

feature

  • feature: add new JsonEngine property in Server and Netcoreserverextension (#49)
  • feature: add new package SimpleW.Newtonsoft to support Newtonsoft.Json as JsonEngine (#50)
  • chore: remove the Newtonsoft.Json dependency from the SimpleW package
  • feature: use JsonEngine for Inline Func return serialization (#58)
  • feature: support Accept-Encoding br (Brotli) on HttpResponse (#51)
  • chore: move all Make*Response from Controller to HttpResponse partial class (#44)
  • feature: support CORS in AddStaticContent() response (#60)
  • feature: AddStaticContent() with no cache (#46)
  • feature: improve overall performances in Router, StaticContent and DynamicContent
  • feature(test): add unit and integration tests.

fix

v15.1.0 / (2025-09-19)

Maintenance

feature

  • chore: expose the Server as a property from the Session (#47)
  • feature: support minimal API with new MapGet() and MapPost() methods in server class (#45)

v15.0.0 / (2025-09-13)

Major release

breakingChange

  • telemetry is now disabled by default. To enable it, set EnableTelemetry property to true (#42)

fix

  • fix: AutoIndex must sort directory first then file (#11)
  • chore: add missing constructor from NetCoreServer (#43)
  • chore: throw exception when using component while the server is already started (#41)

feature

  • feature: handle unix socket (#38), PR by philippseith
  • feature: add new server EnableTelemetry property to enable telemetry (#42)

v14.0.1 / (2025-07-22)

Maintenance

fix

  • fix possible null exception in BroadcastSSESessions() (#37)

feature

  • feature: support CORS in Server Sent Events with MakeServerSentEventsResponse() (#40)

v14.0.0 / (2025-07-20)

Major release

feature

  • create a documentation website
  • feature: support Server Sent Events SSE (#34)
  • chore: update nuget package informations (description, tags, logo, url)

breakingChange

  • refactor: rename all properties WebUsers to WebSocketUsers in ISimpleWServer (#36)

v13.1.0 / (2025-04-21)

Maintenance

fix

  • fix payload parsing for 64 byte payloads (#32), PR by baris-btcturk

feature

v13.0.0 / (2025-02-14)

Major release

fix

  • fix: possible header mismatch when upgrading to websocket connection (#27)

feature

  • chore: bump to NET8 (#26)

v12.0.1 / (2024-12-26)

Maintenance

feature

  • backport fix from Microsoft.IO.RecyclableMemoryStream v3.0.1 to v2.3.
  • backport fix into HttpMultipartDataParser v8.4.0

v12.0.0 / (2024-05-02)

Major release

feature

  • support HTTPS protocol using the new SimpleWSServer() class.

v11.9.0 / (2024-02-15)

Maintenance

breakingChange

  • the getWebUserCallback delegate set with SimpleW.SetToken() is new call by Controller.JwtToWebUser() to redress Controller.webuser on each request.

v11.8.0 / (2024-02-14)

Maintenance

breakingChange

  • refactor: remove unused expiration parameter from NetCoreServerExtension.ValidateJwt() (#19)
  • refactor: remove unused Controller.TokenExpiration property (#18)

feature

  • refactor: change jwt default create expiration from 30min to 15min (#20)

v11.7.0 / (2024-02-02)

Maintenance

breakingChange

  • rename WebSocketMessage.data to WebSocketMessage.body (#17)

feature

  • documentation

v11.6.0 / (2024-02-02)

Maintenance

breakingChange

  • remove NetCoreServerExtension.GetBearer() method.

feature

  • Controller.GetJwt() is now virtual and can be overrided in subclass.
  • documentation

v11.5.0 / (2024-01-14)

Maintenance

breakingChange

  • rename SimpleW.SetTokenWebUserCallback() method to SimpleW.SetToken() and reorder parameters (#3).
  • rename Controller.OnBeforeHandler() method to Controller.OnBeforeMethod().

fix

  • fix(AutoIndex): do not show ".." in root path (#10).

feature

  • feature(WebSocket): handle multiple socket endpoints and not just once (#9).
  • documentation

v11.4.0 / (2024-01-04)

Maintenance

feature

  • property RegExpEnabled must be explicitly enabled to allow regular expression in route path (#2).
  • refactor(Router): use Dictionnary<Key, Route> when RegExpEnabled is false, performances improvement (#1)

v11.3.3 / (2023-12-24)

Maintenance

feature

  • update nuget package settings

v11.3.2 / (2023-12-23)

Maintenance

feature

  • update nuget package settings

v11.3.1 / (2023-12-23)

Maintenance

fix

  • fix wrong label and status for OnWsDisconnected logging

v11.3.1 / (2023-12-23)

Maintenance

fix

  • fix wrong label and status for OnWsDisconnected logging

feature

  • add release-notes
  • enhance logging

v11.3.0 / (2023-12-15)

Maintenance

breakingChange

  • remove Prefix property from RouteAttribute class

feature

  • add new AutoIndex property to list documents when defaultDocument does not exists
  • add new property RegExpEnabled to force Router handle regular expression in Routes

v11.2.0 / (2023-12-09)

Maintenance

feature

  • sync with upstream (NetCoreServer fix websocket closing)
  • split Route with a new Router class
  • rename ObjectMethodExecutor to ControllerMethodExecutor
  • use StringComparison.OrdinalIgnoreCase

v11.1.0 / (2023-11-07)

Maintenance

feature

  • clean code
  • add documentation
  • add license
  • include LitJWT sources in projet files

v11.0.0 / (2023-11-01)

Major release

fix

  • fix huge performances degradation due to old Trace.Trace*() methods

v10.0.0 / (2023-10-22)

Maintenance

breakingChange

  • rename AddApiContent() to AddDynamicContent()

v9.0.1 / (2023-10-22)

Maintenance

fix

  • throw error on starting static server when containing file which size is 0

feature

  • reorganize CompileHandler() method
  • refactor ObjectMethodExecutor.Controllers()
  • add some check to AddApiContent() and AddWebSocketContent() methods
  • refactor RouteAttribute.SetPrefix()
  • clean code

v9.0.0 / (2023-10-12)

Maintenance

feature

  • refactor mimeTable
  • add NetCoreServer Official Readme
  • sync with upstream (HttpMultipartDataParser to v8.2.0)

v8.1.2 / (2023-10-12)

Maintenance

feature

  • compliant to OpenTelemetry http semantic convention

v8.1.1 / (2023-10-12)

Maintenance

feature

  • convert old trace to system.diagnostics.Activity for OpenTelemetry

v8.1.0 / (2023-10-12)

Maintenance

feature

  • preliminary support of system.diagnostics.Activity for OpenTelemetry

v8.0.8 / (2023-08-17)

Maintenance

feature

  • change scope from protected to public for Controller.MakeResponse*()

v8.0.7 / (2023-08-16)

Maintenance

feature

  • add new MakeDownloadResponse(MemoryStream content)

v8.0.6 / (2023-05-15)

Maintenance

breakingChange

  • change MakeRedirectResponse() scope to private

v8.0.5 / (2023-05-15)

Maintenance

feature

  • add new helper Controller.MakeRedirectResponse()

v8.0.4 / (2023-03-30)

Maintenance

feature

  • clean code

v8.0.3 / (2023-03-29)

Maintenance

feature

  • support DateOnly in Controller.Method() parameter

v8.0.2 / (2023-03-19)

Maintenance

feature

  • sync with upstream (Newtonsoft v13.0.3)
  • BodyMap/JsonMap/BodyMapAnonymous : add new json custom converter for hh:mm timeonly

v8.0.1 / (2023-02-16)

Maintenance

feature

  • add new Controller.MakeResponse()

v7.0.0 / (2023-01-25)

Major release

breakingChange

  • refactor SimpleW with BodyMap(), BodyMapAnonymous() and BodyFile()

feature

  • comment

v7.0.0 / (2022-12-01)

Major release

feature

  • sync with upstream (NetCoreServer v7.0.0)
  • sync with upstream (LitJWT v2.0.2)
  • sync with upstream (Newtonsoft v13.0.2)
  • retargeting to NET7

v6.2.4 / (2022-11-30)

Maintenance

feature

  • uniformize http and websocket log

v6.2.3 / (2022-11-30)

Maintenance

feature

  • comment
  • replace special char " in logging url

v6.2.1 / (2022-10-20)

Maintenance

fix

  • logging error and exception

v6.2.0 / (2022-10-05)

Maintenance

feature

  • refactor Controller.GetWebUser() into SetWebUser() and JwtToWebUser()
  • support JWT in WebSocket connexion

v6.1.0 / (2022-10-04)

Maintenance

feature

  • refactor SimpleWServer.AddWebSocketContent()
  • support JWT in WebSocket

v6.0.0 / (2022-10-02)

New Major Version

fix

  • fix null exception in Controller.GetJwt() when parsing request url

feature

  • support Websocket
  • support Route for websocket
  • refactor SimpleWSession/Controller with (SimpleWServer)Session.Server

v5.0.0 / (2022-09-30)

New Major Version

breakingChange

  • rename AddRESTContent to AddApiContent

feature

  • remove exception message output when http 500 error

v4.4.5 / (2022-09-28)

Maintenance

feature

  • sync with upstream (NetCoreServer v6.6.0)
  • sync with upstream (Http-Multipart-Data-Parser v7.0.0)

v4.4.4 / (2022-09-27)

Maintenance

feature

  • support CORS
  • add new HttpResponse.MakeCORSResponse() method

v4.4.3 / (2022-08-29)

Maintenance

fix

  • replace X-Scheme header by X-Forwarded-Proto

feature

  • handle X-Forwarded-Host header in log

v4.4.2 / (2022-08-24)

Maintenance

feature

  • support X-Scheme request header for logging

v4.4.1 / (2022-08-24)

Maintenance

feature

  • log full request url for file in cache and normalize log url
  • log real remote ip
  • refactor Route with the new FQURL() method

v4.4.0 / (2022-08-24)

Maintenance

fix

  • shouldSerializeContractResolver() handle nested class

v4.3.2 / (2022-08-12)

Maintenance

fix

  • sync with upstream (NetCoreServer v6.5.0 fix websocket regression)

v4.3.1 / (2022-08-12)

Maintenance

feature

  • add new parameter description to RouteAttribute

v4.3.0 / (2022-08-11)

Maintenance

feature

  • sync with upstream (NetCoreServer v6.4.0 with Span/Memory)

v4.2.8 / (2022-07-29)

Maintenance

fix

  • sync with upstream NetCoreServer (fix deadlock in websocker/wssession)
  • sync with upstream NetCoreServer (Add HTTP cookie SameSite=Strict mode)

feature

  • comment
  • add new parameter excepts to SimpleW.AddRESTContent() to exclude controllers
  • support wildcard in RouteAttribute

v4.2.7 / (2022-06-28)

Maintenance

feature

  • sync with upstream package LitJWT from v1.2.0 to v2.0.1

v4.2.6 / (2022-06-28)

Maintenance

breakingChange

feature

  • enhance http logging (time, status, user_agent...)

v4.2.5 / (2022-06-14)

Maintenance

feature

  • add new parameter expiration to NetCoreServerExtension.CreateJwt() to control JWT expiration

v4.2.4 / (2022-04-27)

Maintenance

feature

  • enhance http logging (time, status, user_agent...)

v4.2.3 / (2022-04-27)

Maintenance

feature

  • add new paremeter refresh in CreateJwt() to control how Session should refresh the underlying 'IWebUser'

v4.2.2 / (2022-04-07)

Maintenance

breakingChange

  • rename NetCoreServerExtension.PostMap() to NetCoreServerExtension.JsonMap()

v4.2.1 / (2022-04-07)

Maintenance

breakingChange

  • rename NetCoreServerExtension.GetBearerToken() to NetCoreServerExtension.GetBearer()

v4.2.0 / (2022-04-04)

Maintenance

feature

  • replace logging console.log by system.diagnostics

v4.1.0 / (2022-03-22)

Maintenance

breakingChange

  • change some method scope of Route class to private
  • rename Route.Parse() to Route.ParseQueryString()

feature

  • JWT HTTP Header can be override by a jwt querystring in url
  • comment
  • add new NetCoreServerExtension.CreateJwt(IWebUser webuser)
  • refactor ValidateJwt with Generic
  • refactor and simplify TokenWebUser class

v4.0 / (2022-03-21)

New Major Version

breakingChange

  • rename class Controller to ControllerBase

feature

  • add new parameter TokenExpiration to TokenWebUser

v3.2.2 / (2022-03-20)

Maintenance

breakingChange

  • rename DelegateSetTokenWebUser(string login=null) to DelegateSetTokenWebUser(Guid id = new Guid())

v3.1.2 / (2022-03-10)

Maintenance

fix

  • ignore case when parsing http header authorization

v3.1.1 / (2022-03-08)

Maintenance

feature

  • add new ControllerBase MakeForbiddenResponse() and MakeAccessResponse()

v3.1.0 / (2022-02-22)

Maintenance

feature

  • replace InvariantCulture with Ordinal
  • remove JsonSerializerSettingsDefaultCulture from NetCoreServerExtension.PostMap()
  • enhance exception message in NetCoreServerExtension.PostMap()
  • add comment

v3.0.0 / (2022-02-21)

Maintenance

feature

  • retargeting to NET6

v2.3.0 / (2022-02-11)

Maintenance

feature

  • add Http-Multipart-Data-Parser

v2.2.1 / (2022-02-03)

Maintenance

fix

  • remove debug message

v2.2 / (2022-02-03)

Maintenance

fix

  • fix NetCoreServer FileCache.InsertFileInternal() ReadAllBytes() error

v2.1.1 / (2022-01-31)

Maintenance

fix

  • fix correct timestamp in console log

v2.1 / (2022-01-30)

Maintenance

fix

  • fix netcoresever FileCache
  • fix compressTypes in ControllerBase.SendResponseAsync()

v2.0 / (2022-01-23)

New Major Version

feature

  • sync with upstream (NetCoreServer v6.1.0)

v1.1.1 / (2022-01-03)

Maintenance

refactor

  • refactor SimpleWServer.AddWebSocketContent()

v1.1.0 / (2021-12-26)

Initial nuget package release

breakingChange

  • rename PostUpdate() to PostMap()

v1.0.15 / (2021-12-16)

Maintenance

feature

  • support Guid parameter in Controller.Method()

v1.0.14 / (2021-12-16)

Maintenance

fix

  • parameter null converter in Controller.Method()

v1.0.12 / (2021-11-10)

Initial stable release

features

  • serve Statics Files
  • serve REST API
  • routes
  • set default document
  • set custom mime type
  • log with console.writeline