This is for Blazor (server).
According to this documentation, session scope for a service in Blazor (server side) means:
Scoped services aren't reconstructed when navigating among componentson the client, where the communication to the server takes place overthe SignalR connection of the user's circuit, not via HTTP requests.
And in this blog article (seems to be knowledgable):
It creates a scope for each so-called “circuit”. A circuit is createdwhen a new browser tab connects to the Blazor server via theunderlying SignalR transport, and it is terminated when the browsertab is closed again (or if the connection is lost and fails toreconnect within a specified time frame).
But in this Microsoft Q&A it says:
If this is a Blazor Server question then scoped behaves like asingleton. The official documentation covers how service life timeworks..
I think a singleton is the same object across all circuits/sessions. The documentation is as follows.
DI creates a single instance of the service. All components requiringa Singleton service receive the same instance of the service.
Of course "all components" can mean all components in a single circuit/session. Or it can mean all components across all circuits/sessions. I can see how if the "all components" is per circuit/session, then scoped is the same as singleton for most (all) use cases. But if singleton is a single instance across ever circuit/session, then they differ - a lot.
So what exactly is going on for scoped & singleton services on Blazor server?
Summary
The discussion on this got emotional (which I hate to see) and there is a lot of valuable discussion of this question in the two answers below. So no disrespect to them but I am going to summarize the answer here.
A singleton will return the same instance on every call. Good example of a use here, getting the sales tax rate for a location (like Boulder, Colorado). That information is the same for every user.
A scoped will return a different instance for each SignalR circuit (often referred to as scope in Blazor server). For the life of a circuit it will keep returning the same instance to that circuit/session. Good example here is a shopping cart.
What can lead to some confusion - both a singleton and scoped service will return the same instance for the life of the circuit. In that way they are identical.
But if there are two circuits to your server, the singleton will return the same instance to both while the scoped service will return a different instance to each. In this way they are very different.