Releases: theRainbird/CoreRemoting
Releases · theRainbird/CoreRemoting
1.2.3.0
1.2.2.0
New Features and Enhancements
- Added support for LINQ expression return values in remote calls.
- Full ValueTask handling, including new unit tests.
- Introduced experimental QUIC channel (requires .NET 9.0, Windows only) with lock‑protected send/receive and a shared QuicTransport base class.
- New async primitives: AsyncCountdownEvent, AsyncManualResetEvent, AsyncReaderWriterLock, AsyncLock and AsyncDisposable helpers (based on ideas by Stephen Toub and Stephen Cleary).
- Thread‑safe BsonReferenceResolver with reference‑counting to avoid deserialization problems.
- Customizable thread‑pool for event handlers to improve remote‑event processing.
- ServiceProxy now includes ServiceInterfaceType and ServiceName properties.
- Remote event handling improvements: subscription and un‑subscription support for non‑singleton server components, plus an EventStub class ported from the Zyan Framework.
- Session and proxy utilities: ClientConfig can specify a custom proxy builder; all CreateProxy overloads now guarantee identical results.
- Authentication enhancements: new BeginCall event, server Logon/Logoff events, and earlier authentication checks in the server pipeline.
- Channel upgrades:
- WebSocketSharp moved to a dedicated project and external package dependency removed.
- New WebsocketSharpServerChannel and WebsocketSharpClientChannel classes.
- Added System‑Net‑WebSockets client channel.
- Refactored TCP handshake sequence, added configurable MaxMessageSize.
- WatsonTcp v6.0.10 now handles partial headers and disposal race conditions correctly.
- Support for processing messages larger than 2 MiB.
- DataTable serialization added with corresponding unit test.
Bug Fixes and Stability Improvements
- Fixed numerous race conditions, especially around disconnect and dispose operations in TcpClientChannel, WatsonTcpClient and RemotingClient.
- Resolved memory leaks in ClientRpcContext, the internal TCP client, and SmallMemoryStream handling.
- Improved serialization/deserialization handling for DateTimeKind, TimeSpan, BSON for common .NET types, and non‑serializable return values.
- Corrected exception propagation so remote exceptions deserialize reliably; constructors now throw RemoteInvocationException on failure.
- Fixed counter bugs that caused mismatched pending‑message counts.
- Prevented duplicate RPC calls after session disposal or when the client is disconnected.
- Fixed WebSocket thread‑safety issues on Windows for SendAsync and ReceiveAsync.
- Resolved message‑order problems in the TCP handshake (issues #55 and #148).
- Eliminated unhandled exceptions in KeepSessionAliveTimerOnElapsed and other background tasks.
- Fixed authentication failure handling: client no longer stays connected after a failed login; proper disconnect logic added.
- Cleaned up compiler warnings related to missing XML comments, unsafe Task.Result usage, and obsolete IDisposable implementations (now IAsyncDisposable).
- Updated QUIC channel removal handling and solution structure.
- Added missing unit tests for async RPC processing, event handling, DI containers, and race‑condition detection.
Performance and Code Quality Improvements
- Introduced granular lock objects and AsyncLock to reduce contention.
- Replaced wait‑handles with TaskCompletionSource‑based synchronization.
- Added locking for send/receive in QUIC and TCP channels to avoid race conditions.
- Implemented reference‑counter logic for BSON resolver, reducing garbage collection pressure.
- Added SmallBlockMemoryStream to lower allocations when handling large payloads.
- Cleaned up unreachable code, namespace indentation and duplicated warnings.
- Updated CI matrix to include Windows‑latest detection and OS matrix for Linux and Windows testing.
Documentation and Miscellaneous
- Added extensive XML comments and enabled ConfigureAwait(false) compliance checks.
- Provided release notes for many tracked issues (e.g., #92, #95, #100, #105, #108, #116, #120, #134, #141, #153, #155, #156, #163, #168, #192, #203).
- Updated CodeQL workflow to the latest version.
- Included .NET 8.0 as a separate target framework for examples and tests.
Known Limitations
- QUIC channel is Windows‑only and requires .NET 9.0.
- Some tests remain disabled on WebSocket platforms pending further investigation (e.g., CloseSession on websockets).
1.2.1.0
- Change default serializer to BSON to align with non-classic API's default
- Change default channel to TCP to align with non-classic API's default
- Implement TCP channel recognition from Classic Remoting API configuration
- Preventing Leakage of the Remoting Session
- Use Async methods for WatsonTCP
- Replace obsolete methods for Aes encryption
- Remove RemotingSession in a separate task
- Avoid nested envelopes
- RemotingSession shouldn't overwrite the serialized exception with an empty MessageCallResult message.
- Try to keep useful information from the non-serializable exceptions.
- Fix a hang due to a WireMessage deserialization error.
- Demonstrate failing event dispatch when one of the clients disconnects unexpectedly.
- Don't try to dispatch the client events to a disposed remoting session.
- Try your best not to fail event dispatch even if the client had power failure
1.2.0.0
- Added support for cross framework serialization
- Fixed possible thread deadlocks
- Improved service registration and methods for getting service registration metadata.
1.1.16
- Fixed client freeze on server disconnect
- Updated dependencies (Castle.Windsor, WatsonTCP, ...)
1.1.15
- Fixed memory leaks
- Fixed calling inherited interface methods
1.1.14
- Added [ReturnAsProxy]
- Fixed support for out parameters
- Fixed .NET 6.0 support for encryption
1.1.13
Added support for async methods
1.1.12
- Added separate handling for infrastructure exceptions - Moved BeforeCall event firing into user code try block
1.1.7
First feature complete tested release.