Skip to content

Fix ServiceChannel auto-close when server initiates session shutdown #5946

Open
afifi-ins wants to merge 1 commit into
dotnet:mainfrom
afifi-ins:service-channel-auto-close-stuck-5803
Open

Fix ServiceChannel auto-close when server initiates session shutdown #5946
afifi-ins wants to merge 1 commit into
dotnet:mainfrom
afifi-ins:service-channel-auto-close-stuck-5803

Conversation

@afifi-ins
Copy link
Copy Markdown
Contributor

…(#5803)

When a server gracefully closes its duplex session while the client is idle between calls, the duplex receive pump processes the EndRecord and invokes ServiceChannel.DecrementActivity. Previously this only half-closed the inner session via CloseOutputSession and never transitioned the outer ServiceChannel out of Opened, leaving the channel stuck open indefinitely.

DecrementActivity now sends our EndRecord inline (CloseOutputSession) and then schedules a CompleteAutoClose continuation via ActionItem.Schedule so the outer ServiceChannel.Close runs off the receive pump thread (closing inline would deadlock on the SynchronizedMessageSource semaphore). CompleteAutoClose falls back to Abort on Communication/Timeout/InvalidOperation exceptions and swallows ObjectDisposedException.

Adds an outerloop integration test (NetTcp duplex) that hosts a server which stops its host after replying to RequestServerShutdown and asserts the client channel transitions to Closed within 10s, with Closing/Closed events firing and no Faulted event.

@afifi-ins afifi-ins force-pushed the service-channel-auto-close-stuck-5803 branch from bb43bf7 to 73bccb1 Compare May 20, 2026 00:06
@afifi-ins afifi-ins closed this May 20, 2026
@afifi-ins afifi-ins force-pushed the service-channel-auto-close-stuck-5803 branch from 0344418 to e2ef244 Compare May 20, 2026 02:06
…otnet#5803)

When a server gracefully closes its duplex session while the client is idle
between calls, the duplex receive pump processes the EndRecord and invokes
ServiceChannel.DecrementActivity. Previously this only half-closed the inner
session via CloseOutputSession and never transitioned the outer ServiceChannel
out of Opened, leaving the channel stuck open indefinitely.

DecrementActivity now sends our EndRecord inline (CloseOutputSession) and then
schedules a CompleteAutoClose continuation via ActionItem.Schedule so the outer
ServiceChannel.Close runs off the receive pump thread (closing inline would
deadlock on the SynchronizedMessageSource semaphore). CompleteAutoClose falls
back to Abort on Communication/Timeout/InvalidOperation exceptions and swallows
ObjectDisposedException.

Adds an outerloop integration test (NetTcp duplex) that hosts a server which
stops its host after replying to RequestServerShutdown and asserts the client
channel transitions to Closed within 10s, with Closing/Closed events firing
and no Faulted event.

Co-authored-by: Copilot <[email protected]>
@afifi-ins afifi-ins reopened this May 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant