I never programmed a .NET stored procedure, but clearly this happens because the SQL server creates multiple AppDomains (or loads an AppDomain and unloads it after the procedure is done executing). You should be able to see AppDomain activity in the SQL sever log.
From the little I've googled, the SQL server should only load one AppDomain per database. It could be that the code you wrote somehow throws an unhandled exception, which causes the AppDomain to unload (and the server reloads it when the procedure is called again).
It is also possible that the SQL server is under memory pressure, in which case it will unload the AppDomain to save memory.
I don't think you can guarantee just a single Session object within the SQL server, but you can probably minimize the amount of times a new session is created. If you want full control over the session's lifetime, you'll have to host it yourself (perhaps inside a Windows service exposing the session via WCF, and have the SQL server connect to the service in order to interact with the session). As long as SQL server is the host - your session lives by its rules...
(Then again, it could just be that the info I've read is wrong, and SQL server's AppDomain management is done differently)