Scoping resources per HTTP request
Why is it specific to the two properties you have currently? I think it would make sense to make it more generic, but I can't think of a good design to do that.



sealed class RequestScoped : IDisposable


Is it okay for users to call Dispose() by themselves? If not, don't make this type IDisposable and don't make Dispose() public.



private static readonly object key = typeof(RequestScoped);


Since other pieces of code have access to typeof(RequestScoped), they could potentially read or overwrite the RequestScoped instance that's stored in the context by accident. To be on the safe side, I would use new object() here.



/// This method is not thread-safe.


I'm not sure you need to call this out here. Especially since this method is thread-safe, as long as different threads use different contexts.



public static RequestScoped GetOrCreate(System.Web.HttpContext context)


The fact that this method either gets existing object or creates a new one sounds like an implementation detail to me. I would probably call it just Get().

Why are you repeating the namespace for HttpContext instead of using using?



public IDbConnection OpenConnection { get { return connection.Value; } }


Is "open" here supposed to be a verb or an adjective? If verb, then that's not appropriate for a property. If adjective, then it's I think it's not necessary.



public SessionRepository SessionRepo { get { return sessionRepo.Value; } }


I don't see any reason to shorten "repository" to "repo" here, SessionRepository is not that long.



public void Dispose()
{
    if (connection.IsValueCreated)
    {
        try
        {
            if (connection.Value.State == ConnectionState.Open)
            {
                connection.Value.Close();
            }
        }
        catch (Exception)
        {
            // ignore
        }
        connection.Value.Dispose();
    }
}


Why are you not disposing SessionRepository? Is that not necessary?

Also, why are you trying to call Close() and then also call Dispose()? Isn't just Dispose() enough?